抽象工厂模式(Abstract Factory)

简介:

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原则,任何接受父类型的地方,都应当能够接受子类型(比如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,如需转载请自行联系原作者



目录
相关文章
|
9月前
|
设计模式 Linux 开发者
抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)也是一种创建型设计模式,它提供了一种方式,可以创建一系列相互关联或相互依赖的对象,而不需要指定它们的具体类。
69 1
|
12月前
|
设计模式 Java uml
Java设计模式-抽象工厂模式Abstract Factory
Java设计模式-抽象工厂模式Abstract Factory
|
设计模式
《一天一个设计模式》----抽象工厂模式(Abstract Factory)
《一天一个设计模式》----抽象工厂模式(Abstract Factory)
102 0
《一天一个设计模式》----抽象工厂模式(Abstract Factory)
|
设计模式 缓存 Java
创建型-Factory
一般情况下,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。不过,在 GoF 的《设计模式》一书中,它将简单工厂模式看作是工厂方法模式的一种特例,所以工厂模式只被分成了工厂方法和抽象工厂两类。实际上,前面一种分类方法更加常见,所以,在今天的讲解中,我们沿用第一种分类方法。
97 0
|
设计模式 Java
JAVA设计模式(02):创建型-抽象工厂模式(Abstract Factory)
转自:http://blog.csdn.net/lovesomnus/article/details/23672625
116 0
JAVA设计模式(02):创建型-抽象工厂模式(Abstract Factory)
|
Windows 设计模式
设计模式四: 抽象工厂(Abstract Factory)
简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象工厂即是对产品族的抽象.
1862 0
|
Java 设计模式
设计模式——2抽象工厂模式(Abstract Factory)
抽象工厂模式(Abstract Factory)
1338 0