抽象工厂模式(Abstract Factory)

抽象工厂模式详解
本文详细介绍了抽象工厂模式的概念、应用场景及其实现方式。通过实例展示了如何利用抽象工厂模式创建不同操作系统下的视窗构件,如LinuxButton和WinButton,并讨论了通过配置文件实现更灵活的系统设计。

1.参考文献

参考文献1:http://blog.youkuaiyun.com/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原则,任何接受父类型的地方,都应当能够接受子类型(比如ConcreteFactory1ConcreteFactory2都是AbstractFactory的子类型,因此父类型AbstractFactory的对象能够使用子类型进行实例化)。

      因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例(要的是ProductA1ProductA2),而不是这些抽象产品的实例(abstractFactoryAabstractFactoryB)。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

3.实例1:

View Code

运行结果:

4.实例1:java版本

View Code

运行结果:

this is ProductA1
this is ProductB1

5.实例2:

View Code

运行结果:

6.抽象工厂的起源(PS:2011-11-2)

据说最早的应用是用来创建在不同操作系统的视窗环境下都能够运行的系统。比如在Windows与Unix系统下都有视窗环境的构件(如WinButton和LinuxButton),在每一个操作系统中,都有一个视窗构件组成的构件家族。我们可以通过一个抽象角色给出功能描述,而由具体子类给出不同操作系统下的具体实现,如图:

此模式为一个产品家族提供了统一的创建接口。当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对系的系列来创建一个具体的工厂类别。

假设我们有一种产品接口 Button ,这种产品都支持多种系列,比如 Linux 系列和 Windows 系列。这样每个系列的产品分别是 LinuxButton, WinButton。为了可以在运行时刻创建一个系列的产品族,我们可以为每个系列的产品族建立一个工厂LinuxFactory 和 WinFactory 。每个工厂都有一个方法 CreateButton  并返回对应的产品,可以将这个方法抽象成一个接口 AbstractFactory 。这样在运行时刻我们可以选择创建需要的产品系列。

7.代码实例

7.1接口Button

View Code

7.2Linux系统下的Button:LinuxButton

View Code

7.3Windows系统下的Button:WinButton

View Code

7.4视窗的抽象工厂类GUIFactory

View Code

7.5创建WinButton的工厂类:WinFactory

View Code

7.6创建LinuxButton的工厂类:LinuxFactory

View Code

7.7创建Button的应用程序:Application

View Code

7.8主函数类:ApplicationRunner

View Code

 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

View Code

  最后,我们对ApplicationRunner稍作修改,修改后的ApplicationRunner代码如下:

ApplicationRunner.java

View Code

可以发现,用户不需要知道Windows和Linux类型的窗口的具体实现,只需要在客户端中传入Windows或者Linux这样的参数,就可以动态创建具体的产品。

 



本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2011/04/18/2297026.html,如需转载请自行联系原作者



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值