简单工厂(可配置的工厂类)和工厂方法模式以及抽象工厂
2012-10-10 20:57
183 查看
首先,把简单工厂、工厂方法以及抽象工厂放在一起来学习主要是为了让我们更加清晰的了解、掌握它们的区别以及使用的场合。工厂方法的出现是解决简单工厂出现的问题(违背了设计原则的开闭原则OCP),而抽象工厂是解决工厂方法出现的问题(不能创建不同系列的产品)。顺便啰嗦几句:无论你在学习什么东西,它应该是有价值(我个人认为的价值就是能帮我们解决某一类或某一个问题)的,否则这个东西就没有学习的必要。如果你在学习某样东西之前把这个问题清楚了,那么你的学习效率将会得到很高的提升。
如果我们在客户端代码(就是类的使用者)中直接使用具体类,那么客户端需要知道这个实现类的名称(如果有接口也要知道接口)。而我们初衷是不想让客户端知道我们的实现类。这样是很不安全了,而对使用者也需要知道很多信息(麻烦),而且我们也没有遵循面向接口编程。我们可以是用接口把外部调用和内部实现隔离开来。
1.简单工厂模式:一般是一个二级结构,根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。
工厂类:工厂类在客户端的直接控制下创建产品对象。
抽象产品类:定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。
具体产品类:定义工厂具体加工出的对象。
优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
缺点:
违背了设计原则的开闭原则OCP。
2.工厂方法模式:一般是一个三级结构,定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
抽象工厂类:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂类:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品类:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品类:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
优点:
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
缺点:
不能创建不同系列的产品
3.抽象工厂模式:也是一个三级模式,抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一的确定这个产品。
抽象工厂类:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
具体工厂类:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品类:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品类:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
"开放-封闭"原则要求系统对扩展开放,对修改封闭。通过扩展达到增强其功能的目的。对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:
增加产品族:Abstract Factory很好的支持了"开放-封闭"原则。
增加新产品的等级结构:需要修改所有的工厂角色,没有很好支持"开放-封闭"原则。
综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。
如果我们在客户端代码(就是类的使用者)中直接使用具体类,那么客户端需要知道这个实现类的名称(如果有接口也要知道接口)。而我们初衷是不想让客户端知道我们的实现类。这样是很不安全了,而对使用者也需要知道很多信息(麻烦),而且我们也没有遵循面向接口编程。我们可以是用接口把外部调用和内部实现隔离开来。
1.简单工厂模式:一般是一个二级结构,根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。
工厂类:工厂类在客户端的直接控制下创建产品对象。
抽象产品类:定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。
具体产品类:定义工厂具体加工出的对象。
优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
缺点:
违背了设计原则的开闭原则OCP。
2.工厂方法模式:一般是一个三级结构,定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
抽象工厂类:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂类:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品类:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品类:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
优点:
工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
缺点:
不能创建不同系列的产品
3.抽象工厂模式:也是一个三级模式,抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一的确定这个产品。
抽象工厂类:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
具体工厂类:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品类:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品类:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
"开放-封闭"原则要求系统对扩展开放,对修改封闭。通过扩展达到增强其功能的目的。对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:
增加产品族:Abstract Factory很好的支持了"开放-封闭"原则。
增加新产品的等级结构:需要修改所有的工厂角色,没有很好支持"开放-封闭"原则。
综合起来,抽象工厂模式以一种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,而不能为新的产品等级结构的增加提供这样的方便。
相关文章推荐
- 简单工厂方法、工厂方法以及抽象工厂方法的区别
- 简单工厂、工厂方法模式和抽象工厂
- 从建水厂看简单工厂、工厂方法模式和抽象工厂之间的区别
- 简单工厂,工厂模式和抽象工厂,以及策略模式
- 从建水厂看简单工厂、工厂方法模式和抽象工厂之间的区别
- 从建水厂看简单工厂、工厂方法模式和抽象工厂之间的区别
- 从建水厂看简单工厂、工厂方法模式和抽象工厂之间的区别
- java va中工厂模式( 静态工厂模式、工厂方法模式、抽象工厂模式)的介绍以及简单例子
- 从建水厂看简单工厂、工厂方法模式和抽象工厂之间的区别
- 简单工厂模式、工厂方法模式和抽象工厂
- 工厂模式(简单工厂+工厂方法+抽象工厂)
- Java设计模式(2)--简单工厂和工厂方法模式
- 简单工厂、工厂方法与抽象工厂
- 简单工厂,工厂方法与抽象工厂区别体会
- java设计模式之工厂模式(简单工厂,工厂方法,抽象工厂)
- 简单工厂 工厂方法 和抽象工厂区别
- 创建型模式01:简单工厂模式、工厂方法模式、抽象工厂模式
- 简单工厂 工厂方法 抽象工厂 使用方法与区别
- 简单工厂模式与工厂方法模式
- 简单工厂模式、单例模式以及MVC模式