javascript设计模式之创造型抽象工厂模式

以下是使用 TypeScript 实现抽象工厂模式的停车场类、车类和停车费用类的示例代码:

// 车类
interface Car {
  getPlateNumber(): string;
}

class Sedan implements Car {
  private plateNumber: string;

  constructor(plateNumber: string) {
    this.plateNumber = plateNumber;
  }

  getPlateNumber(): string {
    return this.plateNumber;
  }
}

class SUV implements Car {
  private plateNumber: string;

  constructor(plateNumber: string) {
    this.plateNumber = plateNumber;
  }

  getPlateNumber(): string {
    return this.plateNumber;
  }
}

// 停车费用类
interface ParkingFee {
  calculateFee(parkingTime: number): number;
}

class HourlyFee implements ParkingFee {
  private hourlyRate: number;

  constructor(hourlyRate: number) {
    this.hourlyRate = hourlyRate;
  }

  calculateFee(parkingTime: number): number {
    return parkingTime * this.hourlyRate;
  }
}

class DailyFee implements ParkingFee {
  private dailyRate: number;

  constructor(dailyRate: number) {
    this.dailyRate = dailyRate;
  }

  calculateFee(parkingTime: number): number {
    return Math.ceil(parkingTime / 24) * this.dailyRate;
  }
}

// 抽象工厂类
interface ParkingFactory {
  createCar(plateNumber: string): Car;
  createParkingFee(): ParkingFee;
}

// 停车场类
class ParkingLot {
  private carList: Car[] = [];
  private parkingFee: ParkingFee;

  constructor(factory: ParkingFactory) {
    this.parkingFee = factory.createParkingFee();
  }

  parkCar(car: Car): void {
    this.carList.push(car);
  }

  unParkCar(plateNumber: string, parkingTime: number): number {
    const carIndex = this.carList.findIndex((car) => car.getPlateNumber() === plateNumber);

    if (carIndex < 0) {
      throw new Error(`Car with plate number ${plateNumber} is not found.`);
    }

    const car = this.carList[carIndex];
    this.carList.splice(carIndex, 1);

    const fee = this.parkingFee.calculateFee(parkingTime);
    return fee;
  }
}

// 具体工厂类
class SedanParkingFactory implements ParkingFactory {
  createCar(plateNumber: string): Car {
    return new Sedan(plateNumber);
  }

  createParkingFee(): ParkingFee {
    return new HourlyFee(10);
  }
}

class SUVParkingFactory implements ParkingFactory {
  createCar(plateNumber: string): Car {
    return new SUV(plateNumber);
  }

  createParkingFee(): ParkingFee {
    return new DailyFee(50);
  }
}
  • 以上代码定义了 Car 接口和 Sedan、SUV 类作为其实现。 它还定义了 ParkingFee 接口HourlyFee、DailyFee 类作为其实现。
  • 然后,定义了一个抽象工厂类ParkingFactory,该类定义了两个抽象方法,分别用于创建车辆对象和停车费用对象。
  • 最后,定义了一个停车场类ParkingLot,它接受一个 ParkingFactory 对象并使用它来创建车辆和停车费用对象。
  • 该类还定义了 parkCar 和unParkCar 方法,用于停车和取车以及计算停车费用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值