设计模式——简单工厂模式

228 阅读2分钟

1. 简介

定义

简单工厂模式属于创建型模式,又为静态工厂方法模式,是由一个工厂对象决定生产哪一种产品,既是由工厂对象创建哪个类的实例。

分析

简单工厂模式.png

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)。简单工厂模式需要知道所要生产的种类,当子类过多或者子类层次过多时不适合使用。