1. 简介
定义
简单工厂模式属于创建型模式,又为静态工厂方法模式,是由一个工厂对象决定生产哪一种产品,既是由工厂对象创建哪个类的实例。
分析
Factory(工厂类) --> Product(具体产品) --> IProduct(抽象概念图)
- Factory:工厂类,简单工厂模式的核心部分,主要负责生产所有的产品,也就是实例。外界直接调用工厂类的方法来生产自己所需要的产品,也就是创建自己所需的实例,不需要知道其内部逻辑。
- Product:具体产品类
- IProduct:概念图,抽象产品,是具体产品类的公共接口,描述具体产品的属性,行为等。简单工厂模式创建的所有对象的父类。
2. 简单实现
在现实生活中,我们以生产汽车为例。假设一个汽车的代工生产商,它目前能够生产一种便民的汽车 ACar
,由于改革开放,此生产商接触了国外的汽车生产商,也逐步为国外公司代工生产汽车。此时,代工生厂商已经有自己娴熟的生产技术和流程,其现在要代工生产 BCar
, OCar
, PCar
。代码均以 TypeScript
实现。
抽象汽车类
abstract class ICar {
public abstract drive(): void;
}
具体汽车
class ACar extends ICar {
public drive(): void {
console.log('ACar is driven.');
}
}
class BCar extends ICar {
public drive(): void {
console.log('BCar is driven.');
}
}
class OCar extends ICar {
public drive(): void {
console.log('OCar is driven.');
}
}
class PCar extends ICar {
public drive(): void {
console.log('PCar is driven.');
}
}
工厂类
class CarFactory {
public createCar(carType: string): ICar {
let myCar: ICar;
switch (carType) {
case 'aCar':
myCar = new ACar();
break;
case 'bCar':
myCar = new BCar();
break;
case 'oCar':
myCar = new OCar();
break;
case 'pCar':
myCar = new PCar();
break;
}
return myCar;
}
}
客户需求
class client {
public create(): void {
let factory: CarFactory = new CarFactory();
let oCar: OCar = factory.createCar('oCar');
oCar.dirve();
let aCar: ACar = factory.createCar('aCar');
aCar.drive();
}
}
这样,当我们的客户要什么车的时候,直接调用工厂类来生产所需的汽车即可。
3. 使用场景
- 工厂类需要生产的不同种类产品比较少
- 客户不需要知道工厂类生产产品的逻辑,只知道交付给工厂类的参数指标
4. 优缺点
优点: 使用户根据不同的参数来获得各自对应的类实例,避免了直接实例化类,实现了低耦合。
缺点: 可实例化的类型在编译期间就已经被确定了,如果增加新的类型,则需要修改工厂类,违背了开放封闭原则(ASD)。简单工厂模式需要知道所要生产的种类,当子类过多或者子类层次过多时不适合使用。