工厂三姐妹都属于创建模式
一:简单工厂模式
简单工厂模式是类的创建模式,又叫做静态工厂方法模式。就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。
就是用一个单独的类来做这个创造实例的过程,这就是工厂。
优点:
工厂类中包含了逻辑判断,根据客户端的选择动态实例化相关的类。对于客户端来说,除去了与具体产品的依赖。
缺点:
违背了开放—封闭原则(对扩展开放了,但是对修改也开放了),如果给增添一个功能,需要修改工厂类,还要增加子类
工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
二:工厂方法
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂使一个类的实例化延迟到其子类。
是一个抽象产品类,可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类只能创建一个具体产品类的实例
优点:
只是扩展变化,没有修改,符合开放—封闭原则。
把简单工厂的内部逻辑判断移到了客户端代码来进行,若添加功能,现在是修改客户端
缺点:
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。想要增加功能,本来是改工厂类的,而现在是修改客户端。
抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(ConcreteCreator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
三:抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
优点:
1.便于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可使用不同的产品配置
2.具体的创建实例过程与客户端分离客户端通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
缺点:
增加一个功能进行添加多个子类,每个类的开始都需要声明,实例化。
三姐妹比较
简单工厂 | 工厂方法 | 抽象工厂 |
工厂角色和具体产品角色合并,工厂类中 包含了逻辑判断,客户端去除了与具体产品的依赖 | 把内部逻辑给了客户端 |
|
修改 工厂类 | 修改 客户端 |
|
| 1个抽象产品类 | 多个抽象产品类 |
通过接受参数的不同来返回不同的对象实例 | 对每一种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品实例 | 针对产品族 |
同一等级结构中的任意产品(不能增加的新产品) | 同一等级结构中的固定产品(支持增加任意产品) | 不同产品族的全部产品(支持增加产品族,不能增加新的产品) |