ABSTRACT FACTORY(抽象工厂)------ 对象创建型模式

[size=large]1、意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2、别名
Kit
3、动机
考虑一个支持多种视感(look-and-feel)标准的用户界面工具包,例如Motif和Presentation Manager。不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。为保证视感风格标准间的可移植性,一个应用不应该为一个特定视感外观硬编码它的窗口组件。在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格。如下图所示。

[img]http://dl.iteye.com/upload/attachment/0080/7396/50cb5395-4cb7-354f-b036-2ddff110549b.jpg[/img]

为解决这一问题我们可以定义一个抽象的WidgetFactory类,这个类声明了一个用来创建每一类基本窗口组件的接口。每一类窗口组件都有一个抽象类,而具体子类则实现了窗口组件的特定的视感风格。对于每一个抽象窗口组件类,WidgetFactory接口都有一个返回新窗口组件对象的操作。客户调用这些操作以获得窗口组件实例,但客户不知道他们正在使用的是哪些具体类。这样客户就不依赖于一般的视感风格。
每一种视感标准都对应于一个具体的WidgetFactory子类。每一个子类实现那些用于创建合适感官风格的窗口组件的操作。例如,MotifWidgetFactory的CreateScrollBar操作实例化并返回一个Motif滚动条,而相应的PMWidgetFactory操作返回一个Presentation Manager的滚动条。客户仅通过WidgetFactory接口创建窗口组件,他们并不知道哪些类实现了特定风格的窗口组件。换言之,客户仅与抽象定义的接口交互,而不使用特定的具体的接口。
4、适用性
在以下情况下使用Abstract Factory模式
1)一个系统要独立于它的产品的创建、组合和表示时。
2)一个系统要由多个产品系列中的一个来配置时。
3)当你要强调一系列相关产品对象的设计以便进行联合使用时。
4)当你提供一个产品类库,而只想显示他们的接口而不是实现时。
5、结构

[img]http://dl.iteye.com/upload/attachment/0080/8136/c74f7f02-62db-3c13-8f76-cccb087723ed.jpg[/img]

6、参与者
AbstractFactory(WidgetFactory)
----声明一个创建抽象产品对象的操作接口
ConcreteFactory(MotifWidgetFactory,PMWidgetFactory)
----实现创建具体产品对象的操作
AbstractProduct(Windows,ScrollBar)
----为一类产品对象声明一个接口
ConcreteProduct(MotifWindow,MotifScrollBar)
----定义一个将被相应的具体工厂创建的产品对象
----实现AbstractProduct接口
Client
----仅适用由AbstractFactory和AbstractProduct类声明的接口
7、协作
通常在运行时刻创建一个ConcreteFactory类的实例。这一具体的工厂创建具有特定实现的产品对象。为创建不同的产品对象,客户应适用不同的具体工厂。
AbstractFactory将产品对象的创建延迟到它的ConcreteFactory子类。
抽象工厂代码[/size]
interface IProduct1 {  
public void show();
}
interface IProduct2 {
public void show();
}

class Product1 implements IProduct1 {
public void show() {
System.out.println("这是1型产品");
}
}
class Product2 implements IProduct2 {
public void show() {
System.out.println("这是2型产品");
}
}

interface IFactory {
public IProduct1 createProduct1();
public IProduct2 createProduct2();
}
class Factory implements IFactory{
public IProduct1 createProduct1() {
return new Product1();
}
public IProduct2 createProduct2() {
return new Product2();
}
}

public class Client {
public static void main(String[] args){
IFactory factory = new Factory();
factory.createProduct1().show();
factory.createProduct2().show();
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值