面向对象设计模式学习---Abstract Factory模式(创建型)
在软件系统中,经常存在一系列相互依赖对象的创建工作,且由于需求变化,会有更多不同实例对象的创建。抽象工厂模式就是为了提供一种封装机制来避免客户程序(可以使使用类库的程序等)和多系列具体对象创建工作的紧耦合。简而言之,就是为了在系统增加不同类的时候,尽可能减少在客户端程序的改动。
抽象工厂设计思想:提供一个借口,让该借口负责创建一系列相关或则相互依赖的对象,而无需指定改实例化类的具体类型。
抽象工厂设计要点:
1、抽象工厂模式应对的是多系列对象构建的需求变化,且系列对象之间有相互依赖或作用的关系。
2、抽象工厂模式主要应对与“新系列”的需求变动,其缺点在于难以应对“新对象”的需求变动。
举个例子:在一个游戏中,有树、路灯一系列相互依赖的对象,那么游戏中对于树,可能有香蕉树、苹果树等一系列的树,同理路也有多种多样的路。采用这种模式建立的Abstract类型的树类Tree,之后的苹果树等都继承至Tree,那么在客户端的代码不会因为树的类型增加而变化。但如果游戏中由于新的需求变化,需要房屋等的出现,即增加了“新对象”,这种模式就不适合了。这也就是说,抽象工厂模式只在系统系列类型确定的情况下适用。
3、抽象工厂模式经常和工厂方法模式共同组合来应对对象创建的需求变化。
模式举例
类库
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
客户端
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
应用程序
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
由上面代码可以看出,在游戏中如果初始化不同的树,那么在客户端的代码则无需修改。当需求有所改变时,只需要修改类库中的继承类,其他地方不必改动。