简单工厂模式仅仅是把判断类型和产生对象的过程封装给一个工厂对象中了。通过在调用时传入不同的工厂来改变产品的种类。
将对于原来的函数的修改转化为了对工厂的修改或者替换。这不是严格意义上的一种设计模式。但是是接下来的模式的基础。
工厂方法模式:
提供一个接口,让实现的子类来决定判断区分生产哪些类。
依赖的观察 :依赖倒转原则:
两个图的倒转变化。
背后的原理和思路。
保持拓展空间的指导原则:
1.不要有指向具体对象的引用。——也就是不要用new,要用工厂来尽量解决。
2.不要从具体的类中派生类。 如果从具体的类中派生类,这个类就依赖于那个具体类了。要从抽象类或者接口中派生。
3.不要去重写在父类中已经实现了的方法。 如果你重写了已经实现了的方法,那么从一开始,重写的方法的类就不是个真正的抽象类。这些已经实现了的方法的意义是被子类复用,而不是重写。
这些原则作为一种指导,是要在折中的过程中被破坏的。破坏那一条原则,就表明你的类在这个原则维护的拓展可能性中很小。1中的含义是让引用可以指向尽可能多种的可以变化的对象。如果这个对象不需要变化和拓展,那么久不需要这个原则,比如指向String类的引用,就不需要犹豫,因为你的String类不会需要拓展和变化。
2原则中会导致派生类依赖于父类,从而二者的拓展性受到严重的制约。而依赖于抽象类和接口,其实现的子类就会有很大的拓展性,根据功能去做自己的事情。
3原则同样是保证拓展性和2类似。
连锁总部在让各个连锁店有足够的变化性和丰富性的同时,又要保证其对于各地的门店有足够的管控能力不能为所欲为。
抽象工厂模式:
加入调味料工厂来满足不同地方特色的口味。
这里面调味料的工厂的超类就是一个抽象工厂。我们可以使用抽象工厂的接口创建一系列的产品。使用这个接口撰写代码,我们就和实际产生产品的接口解耦了。这让我们可以可以实现用来生产不同上下文的工厂,比如说不同的地区,不同的操作系统,不同的外表和感觉。
因为我们的代码和具体的产品解耦,我们可以使用各种不同的替代工厂来实现不同的最终生产行为。
抽象工厂模式可以让我们生产不同族类的产品。
每一个具体工厂对于抽象工厂的实现,使用的是一个工厂方法模式。即工厂里面有被其他部分调用的抽象方法。抽象工厂模式是对于工厂方法模式的拓展。它抽象出了工厂的子类。
工厂方法模式和抽象方法模式都是将产品的创建封装起来,并且使你的代码和具体的类型解耦。