工厂模式包括:工厂方法模式和抽象工厂模式,可以说抽象工厂模式是在工厂方法模式基础上演变而来的。
工厂方法的作用就是:
原来我们要new一个产品A,则直接new ProductA(); 又来一个新需求要new一个产品B,则直接new ProductB(); 依此类推…
工厂的作用就是提供一个工厂类,由工厂类负责new ProductA()和new ProductB(),而我们只需要传入类型参数new一个工厂类就可以了,工厂类会根据类型来new相应的产品并返回。
注意在工厂方法中,产品A和产品B一般是没有关联的。
用类表示如下:
1 | //Product接口 |
那什么是抽象工厂呢?抽象工厂要解决的问题是:要生成ProductA需要经过三个流程:选购原材料,加工原材料,组装,要生成ProductB也需要经过三个流程:选购原材料,加工原材料,组装,但是各自的流程处理方式都不一样,怎么办呢?
原来的做法是:直接在new Product里添加各自的流程,ProducA和ProductB的流程各自独立,客户端要使用时都是和具体的产品A或B打交道,紧耦合。
抽象工厂就是将生成ProductA的流程封装到一个工厂类ProductA中,将生成ProductB的流程也封装到一个工厂类ProductB中,然后将生成产品的流程抽象到共同的接口Product中,让ProductA和ProductB实现此接口,这么做的前提是工厂生产不同产品的流程是一样的。
现在需要生成产品的客户端只需要提供接口Product属性,具体需要生成ProductA则将此接口属性实例化为ProducA工厂,由具体工厂来执行具体的产品流程。
如果需要新增生成一个产品ProductC,只需要新增具体工厂类ProductC就可以了。
用类表示如下:
接着上面工厂方法的产品类,增加三个流程处理
1 | //原材料类 |
区别:工厂方法是对产品的扩展,抽象工厂是对生成产品的工厂的扩展