今天来看看工厂模式究竟是一个什么玩意,能生产什么,怎么生产。工厂模式和抽象工厂模式又有哪些区别。
- 工厂模式:
类型:创建型模式 ,定义一个常见产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
工厂模式的分类:
- 简单工厂模式(Simple Factory),又称静态工厂方法模式(Static Factory Method Pattern)。
- 工厂方法模式(Factory Method),又称多态性工厂模式(Polymorphic Factory)或虚拟构造器模式(Virtual Constructor)。
- 抽象工厂模式(Abstract Factory),又称工具箱模式(Kit或Toolkit)。
简单工厂模式(Simple Factory)是由一个工厂类传入的参数,动态决定应该创建哪一个产品类的实例,这些产品类继承同一个父类或接口。简单工厂模式一般又称静态工厂方法模式(Static Factory Method),它属于类创建模式,但它不属于23种经典设计模式。
优点:工厂类是整个模式的关键。包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体的对象。使用工厂类,外界可以从直接创建具体产品对象的繁琐局面摆脱出来。仅需要负责“消费”对象,而不必管这些对象究竟如何创建及如何组织的。明确了各自的自责和权利,有利于这个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类,这违背了开闭原则。当系统中的具体产品类不断增多的时候,可能就会要求工厂类根据不同条件创建不同实例的需求。这将会导致各种条件的判断,以便选择具体的产品类型进行实例化。很容易导致工厂类变得臃肿,功能模块不断蔓延。对系统的维护和扩展非常不利。
使用场景:
工厂类负责的对象比较少;
客户只希望负责调用,对如何创建对象和对象内的实现逻辑并不关心;
工厂方法模式(Factory Method)与简单工厂模式相比,为了解决工程类中耦合的问题,将原有的实例创建逻辑推迟到子类中。核心工厂类不再负责产品的创建,核心类成为一个抽象工厂角色,仅负责声明接口。这样做的好处是在不修改具体工厂角色的情况下引入新产品。
优点:
继承了简单工厂模式的优点,符合开闭原则。
缺点:
增加产品,需要增加对应的新的工厂类。这将会导致系统类个数成对增加,在一定程度上增加了系统的复杂性。
抽象工厂模式(Abstract Facotry Pattern)提供一个创建一系列相关或相互依赖对象的的接口,而无须指定他们的具体类。抽象工厂模式又称为Kit模式,属于对象创建模型。
模式动机:
在工厂方法模式中具体工厂负责生产具体的产品,每个具体工厂对应一种具体的产品,工厂方法也有唯一性。
简单工厂模式
简单工厂模式不是 23 种里的一种,简而言之,就是有一个专门生产某个产品的类。
比如下图中的鼠标工厂,专业生产鼠标,给参数 0,生产戴尔鼠标,给参数 1,生产惠普鼠标。
工厂模式
工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口。
戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。
生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建。
后续直接调用鼠标工厂.生产鼠标()即可
抽象工厂模式
前面介绍的工厂方法模式中考虑的是一类产品的生产,鼠标厂只生产鼠标。但是现实生活中许多工厂是综合型的工厂,能生产许多种类的产品,如电子设备加工厂即能生产鼠标又能生产键盘。
下面来介绍抽象工厂模式,抽象工厂模式将考虑多等级产品的生成,也就是要不仅生产鼠标,同时也要生产键盘。将同一个具体工厂生成的位于不同等级的产品作为 一个产品族存在。
也就是 PC 厂商是个父类,有生产鼠标,生产键盘两个接口。
戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。
创建工厂时,由戴尔工厂创建。
后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。
在抽象工厂模式中,假设我们需要增加一个工厂
假设我们增加华硕工厂,则我们需要增加华硕工厂,和戴尔工厂一样,继承 PC 厂商。
之后创建华硕鼠标,继承鼠标类。创建华硕键盘,继承键盘类即可。
在抽象工厂模式中,假设我们需要增加一个产品
假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。
之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。 以上。
抽象工厂模式一般要满足:
系统中有多个产品族,每个具体工厂创建同一族但属于不同等级的产品。
系统一次只可能消费其中某一族产品,即同族产品一起使用。
抽象工厂模式优点:
可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
当增加一个新的产品族时不需要修改源代码,满足开闭原则。
缺点是:
当产品族中需要增加一个新产品时,所有的工厂类都要进行修改。
模式的扩展
抽象工厂的扩展性有一定的“开闭原则”倾斜性:
- 当增加一个新的产品族时只需要增加一个新的具体工厂,不需要修改源代码,满足开闭原则。
- 当产品族需要增加一个新种类的产品时,则所有的工厂类都 要进行修改,不满足开闭原则。
必须要提一下,如果系统中只存在一个等级结构的产品时,抽象工厂模式将退化到工厂方法模式。
最后:
生活之所以累,一半源于生存,一半源于攀比。但求自己每日精进,不要被别人所诱惑。