以下是使用 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 方法,用于停车和取车以及计算停车费用。