1.声明
设计模式中的设计思想、图片和部分代码参考自《Head First设计模式》,作者Eric Freeman & Elisabeth Freeman & Kathy Siezza & Bert Bates。
在这里我只是对这本书进行学习阅读,并向大家分享一些心得体会。
2.依赖具体类的缺陷
由第2篇,我们知道了,工厂方法模式可以较好的解决对象依赖的问题,使程序更易维护,但是还有另外一种工厂模式,也可以帮助我们从依赖中解脱出来,它就是抽象工厂模式。
现在我们忘掉抽象工厂模式,来看一下抽象工厂模式是如何解决这个问题的,它和工厂方法模式有什么异同。
2.1一个饱受依赖困扰的案例
下面是一个比萨店,首先会创建比萨,并且会执行订单流程:
关系图:
可以看见,PizzaStore依赖于众多的比萨类型,每新增一个比萨类型,那么PizzaStore就会多一个依赖,这样设计的后果是,任何一个比萨类型出现变动,都会影响到PizzaStore。
3设计原则-依赖倒置原则
设计原则
要依赖抽象,不要依赖具体类。
这个原则听起来很像"针对接口编程,不针对实现编程",是的,但是这里更强调”抽象“两个字。
这个原则说明了,不能让高层组件依赖于低层组件,而且不管高层组件还是低层组件,二者都应该依赖于抽象。
高层组件和低层组件的概念:
所谓高层组件,是由其他底层组件定义其行为的类。例如,PizzaStore是高层组件,因为它的行为是由比萨定义的,PizzaStore创建所有不同的比萨对象,准备、烘培、切片、装盒,而比萨属于低层组件。PizzaStore依赖于这些具体Pizza类。
3.1工厂方法的解决方式
在上面的代码中,尽管我们用超类Pizza作为每个具体比萨类的引用接收,但是我们仍然在代码中创建了比萨的实例,所以仅仅这个抽象是非常鸡肋的。
工厂方法模式的解决方案:
可见,高层组件PizzaStore和低层组件(具体的Pizza)都依赖于Pizza抽象,想要遵循依赖倒置原则,工厂方法模式是最有威力的技巧之一,但是它不是唯一的解决方法。
3.2依赖倒置原则使用方针
下面几种指导方针,可以避免我们违反依赖倒置原则:
- 变量不可以持有具体类的引用,即用工厂代替new对象。
- 不要让类派生自具体类,应该派生自一个超类,这样就不会依赖于一个具体类。
- 不要覆盖基类中已实现的方法,如果覆盖的话,那么这个基类就不是一个真正适合被继承的抽象。基类中已实现的方法,应该由所有子类所共享。
需要注意的是,我们应该合适使用这些指导方针,而不是处处使用,否则就写不出J