HeadFirst(四)Factory 工厂设计模式
?
?
??
简单工厂与工厂方法的区别:
?
简单工厂,是一个被PizzaStore使用的对象,简单工厂作为外部一个类被组合到PizzaStore中;
简单工厂,把全部的事情在一个地方都处理完了。
?
工厂方法,有一个抽象方法createPizza(),由PizzaStore的子类自行负责createPizza()的行为;
工厂方法,创建了一个框架(框架依赖工厂方法创建具体类),让子类决定要如何实现。
?
设计原则
依赖抽象,不要依赖具体类
不能让高层组件依赖于底层组件,而且,不管高层或底层组件,两者都应该依赖于抽象
简单点说,就是要面向抽象编程
?
变量不可以持有具体类的引用
如果使用new,就会持有具体类的引用。
你可以改用工厂来避开这样的做法。
不要让类派生自具体类
如果派生自具体类,你就依赖具体类。
请派生自一个抽象(接口或抽象类)。
不要覆盖基类中已经实现的方法
如果覆盖基类已经实现的方法,那么你的基类就不是一个真正适合被继承的抽象。
基类中已实现的方法,应该由所有子类共享。
?
尽量达到上述要求,而不是随时都要遵守,根据实际情况考量!
?
?
Pizza 抽象类
?
??
?
具体的Pizza-NYStyleCheesePizza
?
?
??
?
工厂方法与抽象工厂的比较
?
工厂方法:
通过继承父类,实现父类的抽象方法并返回具体的对象
如,NYPizzaStore继承PizzaStore,通过实现createPizza()返回NYStyleCheesePizza
?
抽象工厂:
通过对象间的组合,通过被组合的对象去调用子类的方法,完成所需对象的创建
如,NYStyleCheesePizza中,通过与PizzaIngredientFactory进行组合,在覆盖父类的抽象方法prepare()时,调用PizzaIngredientFactory对一组原料对象进行创建
?
可以把一组相关的产品集中起来进行创建;
缺点:如果需要扩展新的产品,就必须改变接口;
?
?
抽象工厂模式应用示例
不同地区的PizzaStore需要使用不同的原料来制作Pizza
?
原料---接口
?
?
?