创建型模式-工厂模式

一、引言

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。
模式的问题:如何轻松构建对象,而不必关心创建对象的细节和复杂过程。 
解决方案:建立一个工厂来创建对象。它为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽起来,提高灵活性。
 

二、分类

工厂模式可以分类三类:
(1)简单工厂模式 simple factory
(2)工厂方法模式:factory method
(3)抽象工厂模式:abstract factory

三、区别

(1)简单工厂模式:一个工厂类,可以获取多个产品类实例。
(2)工厂方法模式:
一个抽象产品类,可以派生多个具体产品类。
一个抽象工厂类,可以派生多个具体工厂类。
每个具体工厂类派生一种产品类。
(3)抽象工厂模式:
多个抽象产品类,可以派生多个具体产品类。
一个抽象工厂类,可以派生多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
工厂方法模式和抽象工厂模式的区别:
一个抽象产品类 VS 多个抽象产品类 ;
每个具体工厂派生产品类实例:一种 VS 多种

四、简单工厂模式(静态工厂模式)

组成:一个工厂、一个抽象产品、多个具体产品。工厂里面提供静态方法获取对象实例。
优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定 的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要在工厂类中增加相应的业务逻辑。违反开闭原则。

五、工厂方法模式:factory method

组成:一个抽象工厂,一个抽象产品,多个具体工厂、多个具体实例。
去掉了简单工厂模式中的静态方法。在工厂方法模式中,不再提供一个统一的工厂类创建所有的对象,而是针对不同的产品提供不同的工厂。与简单工厂模式相比:引入了抽象工厂角色。由具体的抽象工厂子类去创建对象。解决了简单工厂模式中工厂类职责太重的问题。当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代码。符合开闭原则。
缺点:当产品种类非常多时,会出现大量与之对于的工厂类,这不是我们希望的。

六、抽象工厂模式:abstract factory

在工厂方法模式中,具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品。有时候我们希望一个工厂可以提供多个产品对象,而不是单一的产品对象。如一个电器厂,它可以生产电视机、电冰箱等。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,而是负责创建一组产品族。为了理解抽象工厂模式,引入两个概念。
1、产品等级结构:即产品的继承结构。抽象电视机是父类,而具体的品牌海尔电视机、TCL电视机是其子类。
2、产品族:在抽象工厂模式中,它是指由同一个工厂生产的,位于不同产品等级中的一组产品。如海尔电器工厂生产海尔电视机、海尔冰箱。即一个工厂生产多个产品对象。
 
总结:
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。 在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
参考:https://www.cnblogs.com/yumo1627129/p/7197524.html  《Java设计模式》
原文地址:https://www.cnblogs.com/suiyilaile/p/10097640.html