工厂模式主要有如下三种:
1.简单工厂
2.工厂方法模式
3.抽象工厂
简单工厂:
简单工厂有一个工厂类,负责创建产品,而产品是所有具体产品的抽象,定义了产品的接口。
糖果是产品的定义,而大白兔,荷氏薄荷,牛轧糖则是实际的产品,糖果工厂根据传入的名称参数生产不同的糖果。
该模式的缺点在于所有创建产品的逻辑全部集中在工厂类中,随着产品的拓展可能会导致工厂的创建逻辑越发复杂,并且也违反了设计模式中高内聚的原则。
工厂方法模式:
工厂方法模式一定程度上优化了简单工厂模式的问题,通过增加工厂接口类和具体工厂类,将创建产品的逻辑一定程度分散到具体工厂类中去了,如果新增了一类产品,只需为该产品编写单独的工厂类,而不影响已经存在的工厂类。
具体UML大致如下:
糖果是产品的接口,而糖果工厂则是工厂的接口,不同的工厂(上好佳/荷氏)生产不同的产品(薄荷糖))
综合来说,该模式由抽象工厂,具体工厂,抽象产品,具体产品组成
对于用户来说,创建不同的具体工厂来生产不同的具体产品,而不同的具体工厂都实现了抽象工厂中申明的工厂接口。
抽象工厂:
抽象工厂和工厂方法模式最大的区别在于,抽象工厂是用来处理一组有相互关联作用的一组产品组合的创建,而工厂方法模式则只是处理单一一类产品的创建。
也就是说,在抽象工厂模式中,工厂创建不同类型的产品,并且这些产品之间是会有互相依赖的关系的。
一个比较合适的例子来源于书上介绍的关于电脑组装厂的例子,例如DELL和联想
DELL和联想都会生产兼容PC机,而PC机则主要是有CPU,内存,硬盘,主板组成,并且主板是和CPU之间有较强的兼容关系(INTEL的CPU不能插在兼容AMD CPU的主板上)
联想和IBM都是具体的电脑工厂,分别将不同品牌的CPU,硬盘,主板和内存组装成具体的PC产品,并且CPU和主板是需要进行配对使用的。
这里为了简化,所以直接用了intel和AMD等厂商的名字,按理他们应该属于产品工厂,而具体的型号名称才是具体产品,例如I3,I5,Athlon等。
抽象工厂模式主要用于创建一个产品族,对于PC来说,他就是一个产品族,包含了主板,CPU,内存和硬盘等产品。对于用户来说,不需要知道和创建具体的CPU,内存等具体产品,完全交给工厂来完成,创建出来的是PC这么一个从产品族,而不同的具体工厂(DELL和联想),创建的产品族中则包含不同的具体产品(AMD/INTEL的CPU, 三星/闪迪的内存等),每一个具体工厂都和一组产品绑定在一起。
引用: