一、时常听到各种工厂,解读工厂
很多人大概从开始工作起,逐渐接触听说过各项工厂类名词,什么“简单工厂模式”啊,什么“静态工厂方法”啊,什么“工厂模板”模式啊,什么“抽象工厂方法”啊,等等
时常听着一头雾水,或者一时半知半解,甚至觉得怎么听着在玩概念,故弄玄虚一样。明明听着有什么联系,但又理不清头绪似的。
其实:
简单工厂模式(Simple Factory):简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。[百度百科】
工厂方法模式(Factory Method):是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品【百度百科】
抽象工厂模式(Abstract Factory):抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。【百度百科】
二、3种工厂的意图及目的
简单工厂 : 在工厂类中由用户操作传入相关参数来动态决定生产那种具体产品实例的过程
目的是为了封装动态生成具体产品实例的过程,使用多态定义N种具体产品实例,而在用户选择时动态决定最后去创建那种具体产品实例的过程。
优点:封装了工厂类中相关判断逻辑,解除了客户端与具体产品的耦合,客户端只要给对应选择条件,工厂类会根据对应条件动态实例化具体产品类。
缺点:当突然有新的具体产品引入的时候除需要引入新的产品实例类,还需要变更工厂类中动态生产具体产品实例的部分,违反了软件设计之开-闭原则
工厂方法模式 :定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
主要是为了解决简单工厂中因新产品加入时变更工厂类逻辑而违背开闭原则的设计
优点:将具体产品的实例化延迟至具体工厂中完成,在子类中决定实例化。这样当有新产品引入时不用变更工厂逻辑,而只需要添加新的具体工厂即可。解决了简单工厂中破坏的开-闭原则的问题
每个具体工厂只负责具体产品的实例化,符合软件设计的单一职责原则
缺点:当引入具体产品时,会引入具体工厂子类,增加了代码的复杂度
当工厂改产品线由原只生产A变更为只生产B时,仍然需要变更产品B的具体工厂类
一个具体工厂只能生产一个具体的产品
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
主要为了解决工厂方法中一个具体工厂只能实例化一个具体产品的缺陷
优点:相对工厂方法模式,抽象工厂模式支持某个产品序列,而工厂方法只针对某一具体产品
当需要变更产品系列(多个产品)时,只需要变更具体工厂类即可。改动非常小且非常容易,符合开闭原则
客户端与具体实例的创建完全分离,整个产品创建过程只与具体工厂的接口定义有关(而与是那个具体产品无关),典型面向接口而非面向实现,符合这依赖倒置原则。
缺点:新增加具体产品时,改动会非常大,需要增加一个抽象产品类及该产品类的实现,同时还需要更改抽象工厂类(添加生产该产品的方法)以及具体工厂类(添加生产该产品的方法实现)。
三、各工厂对应的UML图及主要角色
简单工厂模式
四、各工厂对应代码示例说明
原文:https://www.cnblogs.com/AreaWhere/p/9427900.html