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

1. 简介

定义

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

分析

简单工厂模式.png

Factory(工厂类) --> Product(具体产品) --> IProduct(抽象概念图)java

  • Factory:工厂类,简单工厂模式的核心部分,主要负责生产全部的产品,也就是实例。外界直接调用工厂类的方法来生产本身所须要的产品,也就是建立本身所需的实例,不须要知道其内部逻辑。
  • Product:具体产品类
  • IProduct:概念图,抽象产品,是具体产品类的公共接口,描述具体产品的属性,行为等。简单工厂模式建立的全部对象的父类。

2. 简单实现

在现实生活中,咱们以生产汽车为例。假设一个汽车的代工生产商,它目前可以生产一种便民的汽车 ACar ,因为改革开放,今生产商接触了国外的汽车生产商,也逐步为国外公司代工生产汽车。此时,代工生厂商已经有本身娴熟的生产技术和流程,其如今要代工生产 BCar, OCar, PCar。代码均以 TypeScript 实现。ui

抽象汽车类

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();
    }
}
复制代码

这样,当咱们的客户要什么车的时候,直接调用工厂类来生产所需的汽车便可。spa

3. 使用场景

  • 工厂类须要生产的不一样种类产品比较少
  • 客户不须要知道工厂类生产产品的逻辑,只知道交付给工厂类的参数指标

4. 优缺点

优势: 使用户根据不一样的参数来得到各自对应的类实例,避免了直接实例化类,实现了低耦合。code

缺点: 可实例化的类型在编译期间就已经被肯定了,若是增长新的类型,则须要修改工厂类,违背了开放封闭原则(ASD)。简单工厂模式须要知道所要生产的种类,当子类过多或者子类层次过多时不适合使用。cdn

相关文章
相关标签/搜索