1 简单工厂模式:通过工厂创建实例,不关注实现细节,不符合开闭原则,导致代码结构复杂,不易维护,属于产品型工厂 Calender日历类,LoggerFactory日志类属于简单工厂
2 工厂方法模式:通过抽象,定义工厂,子工厂做实现,由子工厂创建实例,属于工厂规范 工厂型工厂 LogFactory属于工厂方法
3 抽象工厂模式:产品组与产品结构比较复杂的情况下建议使用,改动周期较小,不符合开闭原则 例如不同厂商的 单车,助力车的创建,厂商属于产品族 都生产单车和助力车 不同厂商属于产品结构,厂商拓展新产品线的周期较长 属于复杂产品型工厂
应用列举:DB连接池Pool类属于抽象工厂模式 创建,初始化,释放资源都可以理解为产品结构,pg,mysql,oracle数据产品族
工厂方法和抽象工厂区别思考:
工厂方法是定义一种工厂,例如A类型工厂定义,是生产单车的,那生产单车的工厂,就得满足A类型工厂定义的一个方法,能生产单车,针对工厂类型,再根据工厂类型,产出产品,至于其他拓展功能,不相关
抽象工厂,针对产品,生产单车的工厂,需要生产,拼装,着色,贴标,这些动作,每个生产单车的工厂都需要的供需,就用抽象工厂定义,还是针对产品,根据产品性质设计工厂。
产品族和产品等级结构概念
附几年前的理解:简单工厂模式:定义一个工厂类,对象的实例化交给工厂类实现,调用话不需要关注实现过程。工厂类随着业务增加,不断扩展,可以通过一些反射,类指定等参数方式做优化,但是依旧解决不了复杂业务。jdk中的Calender实例化,
工厂方法模式:定义一个工厂接口,但是没有类的实例化逻辑,具体的实例化逻辑,放入子类中去实现,符合单一职责原则。
场景:可以把助力车的生产看着一个工厂定义,我们称之为车辆生产工厂,这是一类工厂的统称,然后哈啰单车,青桔,美团单车的三个生产工厂,都是属于车辆生产工厂一类,只不过各自的产品不同。这就是典型的工厂方法模式,相比于简单工厂,这种方法符合开闭原则,单一职责原则。缺点就是定义的类可能会比较多,代码可读性要弱一些。
代码中的实现:ILoggerFactory的实现,就是典型的工厂方法模式,这个借口下面实现了SubstituLoggerFactory,NOPLoggerFactory,Log4jLoggerFactory三种实现。
抽象工厂模式:首先构思一种场景,单车,助力车,景区车,这是三种车型,品牌分别有哈啰,青桔,美团,这是三个品牌。三个品牌都可以生产三种车型,这样的话产品结构就偏复杂了。三种车型,属于产品的一个族类,一种单车,三种规格,属于产品结构:抽象工厂的功能,就是定义一个工厂接口,可以生产单车,助力车,景区车,至于具体是哈啰单车,还是其他的单车,抽象工厂不关注,但是都要有骑行的功能。然后定义单车,助力车,景区车,不论是哪种品牌,都需要实现这里的定义。这样,即便有新的品牌加入,也早已经定义好了一套标准规范。
思考:工厂方法能不能替代抽象工厂模式:工厂方法职责单一,这种工厂只能生产单车,相比于抽象工厂方法,后者业务能力更强,是一种升级。
原文:https://www.cnblogs.com/xianyi/p/14643758.html