Blaze 2018-12-15
关系图
问题:
简单工厂模式与工厂方法模式真正的避免了代码的改动了?
没有。
在简单工厂模式中,新产品的加入要修改工厂角色中的判断语句;
而在工厂方法模式中,要么将判断逻辑留在抽象工厂角色中,要么在客户程序中将具体工厂角色写死(就象上面的例子一样)。
而且产品对象创建条件的改变必然会引起工厂角色的修改。
用意:
给客户端提供一个接口,可以创建多个产品族中的产品对象。
条件:
1)系统中有多个产品族,而系统一次只可能消费其中一族产品。 ;
2)同属于同一个产品族的产品以其使用。 ;
角色: ;
1)抽象工厂角色: ;这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 ;
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
缺点:
抽象模式最大的缺点就是产品族的扩展,如果要加一个新的产品,差不多所有的工厂类都需要进行修改,
所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
工厂方法与抽象工厂比较:
工厂方法模式:
【一】个抽象产品类,可以派生出多个具体产品类。 ;
一个抽象工厂类,可以派生出多个具体工厂类。 ;
;每个具体工厂类只能创建【一】个具体产品类的实例。
抽象工厂模式:
【多】个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 ;
一个抽象工厂类,可以派生出多个具体工厂类。 ;
;每个具体工厂类可以创建【多】个具体产品类的实例。 ;
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 ;
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个