1.参考文献
参考文献1:http://blog.csdn.net/ipqxiang/archive/2007/12/20/1955677.aspx
参考文献2:http://baike.baidu.com/view/1580269.htm#sub1580269
参考3:http://en.wikipedia.org/wiki/Abstract_factory_pattern#Java
参考文献4:反射在工厂模式上的应用
2.概念描述:
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端(Client)提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象(只需要提供抽象工程实例)。
根据LSP原则,任何接受父类型的地方,都应当能够接受子类型(比如ConcreteFactory1和ConcreteFactory2都是AbstractFactory的子类型,因此父类型AbstractFactory的对象能够使用子类型进行实例化)。
因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例(要的是ProductA1,ProductA2等),而不是这些抽象产品的实例(abstractFactoryA和abstractFactoryB)。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
3.实例1:
运行结果:
4.实例1:java版本
运行结果:
this is ProductA1
this is ProductB1
5.实例2:
运行结果:
6.抽象工厂的起源(PS:2011-11-2)
据说最早的应用是用来创建在不同操作系统的视窗环境下都能够运行的系统。比如在Windows与Unix系统下都有视窗环境的构件(如WinButton和LinuxButton),在每一个操作系统中,都有一个视窗构件组成的构件家族。我们可以通过一个抽象角色给出功能描述,而由具体子类给出不同操作系统下的具体实现,如图:此模式为一个产品家族提供了统一的创建接口。当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对系的系列来创建一个具体的工厂类别。
假设我们有一种产品接口 Button ,这种产品都支持多种系列,比如 Linux 系列和 Windows 系列。这样每个系列的产品分别是 LinuxButton, WinButton。为了可以在运行时刻创建一个系列的产品族,我们可以为每个系列的产品族建立一个工厂LinuxFactory 和 WinFactory 。每个工厂都有一个方法 CreateButton 并返回对应的产品,可以将这个方法抽象成一个接口 AbstractFactory 。这样在运行时刻我们可以选择创建需要的产品系列。
7.代码实例
7.1接口Button
7.2Linux系统下的Button:LinuxButton
7.3Windows系统下的Button:WinButton
7.4视窗的抽象工厂类GUIFactory
7.5创建WinButton的工厂类:WinFactory
7.6创建LinuxButton的工厂类:LinuxFactory
7.7创建Button的应用程序:Application
7.8主函数类:ApplicationRunner
8.实现可配置的抽象工厂模式(ps:2012-5-30)
参考前面写过的一片文章:反射在工厂模式上的应用。在这片文章中,就实现了可配置化。在原先的主函数类:ApplicationRunner中,我们需要定义一个OS_TYPE变量,然后根据OS_TYPE变量的数值来判断到底是Linux系统还是Windows系统,如果操作系统的种类很多,并且添加了操作系统的种类,那么就必须修改系统代码来应对操作系统种类的增加。这样不易维护,我们可以通过配置文件来修改原来的代码,使得系统更加灵活。
首先,我们在项目包目录下添加配置文件OS.properties,文件内容如下:
Linux=edu.sjtu.erplab.designpattern.abstractfactory3.LinuxFactory
Windows=edu.sjtu.erplab.designpattern.abstractfactory3.WinFactory
然后,在这里我们引用博客:反射在工厂模式上的应用中所用到的配置文件操作类Init,代码如下:
Init.java
最后,我们对ApplicationRunner稍作修改,修改后的ApplicationRunner代码如下:
ApplicationRunner.java
可以发现,用户不需要知道Windows和Linux类型的窗口的具体实现,只需要在客户端中传入Windows或者Linux这样的参数,就可以动态创建具体的产品。
本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2011/04/18/2297026.html,如需转载请自行联系原作者