简单工厂
定义
在创建一个对象时,不向客户暴露内部细节,并提供一个创建对象的通用接口
类图
简单工厂把实例化的操作单独放到一个类中,这个类就称为简单工厂类,让简单工厂类来就决定应该用哪个具体子类来实例化。
这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么素偶又的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。
简单工厂在JDK的应用
JDK中的Calendar使用了简单工厂
工厂方法
定义
定义了一个创建对象的接口,由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。
类图
在简单工厂中,创建对象的是工厂类,而在工厂方法中,是由子类来创建对象。
抽象工厂
定义
提供一个接口,用于创建相关的对象家族
Class Diagram
抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。
抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory
中的createProductA()
和createProductB()
方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,这符合工厂方法模式的定义。
至于创建对象的家族这一概念实在Client
体现,Client
要通过AbstractFactory
同时调用两个方法来创建出两个对象,在这里这两个对象就有很大的相关性,Client
需要同时创建出这两个对象。
从高层次来看,抽象工厂使用了组合,即Client
组合了AbstractFactory
,而工厂方法模式使用了继承。
个人理解:我认为抽象工厂模式完全是多态的其中一个体现,我在实际开发中使用的可能只是子类,但子类也完全可以呈现出父类的样子,例如我们常写的:List<Integer> list = new ArrayList<>()
工厂模式小结
-
工厂模式的意义
将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
-
三种工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
-
设计模式的依赖抽象原则
- 创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回。(加一个缓冲区)
- 不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
- 不要覆盖基类中已经实现的方法
个人理解
依旧是用一个例子类配合自己的理解,例如特斯拉汽车工厂,在没有工厂以前,我需要什么特斯拉我就直接new一个特斯拉出来,在业务逻辑简单的时候,这样子的方式完全没问题,但这样会有很多的if else
分支,而且当需要增加一个新的特斯拉类的时候,改动的代码很多,于是就需要使用简单工厂,将这些new的过程封装到工厂里面,你需要什么我给你什么,这样子的简单工厂是只生产一个类的,例如我就只是特斯拉的工厂,不能生产宝马。
随着我的业务扩张,我的要求也更多了,我现在不止要在中国生产特斯拉,我还要在新加坡生产特斯拉,这个时候以前的简单工厂就不适用了,因为中国生产的特斯拉跟新加坡生产的特斯拉虽然流程都一样的,但其中肯定会有不一样的细节,因此不用直接套用中国工厂,于是工厂方法也就产生了,我在工厂类中对方法进行抽象,将实例化的过程放到工厂类的子类中,于是中国的工厂实现自己的生产工厂,新加坡的工厂实现自己的生产工厂,这便是工厂方法。
上述两个设计模式呢,解决的都是单个类的问题,如果我需要生产不同的类,例如我除了上产汽车,我还生产摩托车,那么原来的简单工厂以及工厂方法就不再适用了,要使用抽象工厂,就是对工厂方法再进行一层抽象,使用一个抽象工厂统一管理一个工厂家族,工厂家族中的每个工厂类使用工厂方法,这便是抽象工厂的设计模式。