1、意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的实例
2、适用性
在以下情况下可以使用Abstract Factory模式
(1)一个系统要独立于它的产品的创建、组合和表示时
(2)一个系统要由多个产品系列中的一个来配置时
(3)当你要强调一系列相关的产品对象的设计以便进行联合使用时
(4)当你提供一个产品类库,而只想显示它们的接口而不是实现时
3、参与者
(1)AbstractFactory:声明一个创建抽象产品对象的操作接口
(2)ConcreteFactory:实现创建具体产品对象的操作
(3)AbstractProduct:为一类产品对象声明一个接口
(4)ConcreteProduct:定义一个将被相应的具体工厂创建的产品对象,实现Abstract接口
(5)Client:仅使用AbstractFactory和AbstractProduct类声明的接口

UML类图表示为

java代码为:

package javatest;interface Button
{public void paint();
}class WinButton implements Button
{@Overridepublic void paint(){System.out.println("WinButton");}
}class OSXButton implements Button
{@Overridepublic void paint(){System.out.println("OSXButton");}
}interface GUIFactory
{public Button createButton();
}class WinFactory implements GUIFactory
{@Overridepublic Button createButton(){return new WinButton();}
}class OSXFactory implements GUIFactory
{@Overridepublic Button createButton(){return new OSXButton();}
}public class JavaTest
{public static void main(String[] args){       GUIFactory factory = new WinFactory();Button btn = factory.createButton();btn.paint();factory = new OSXFactory();btn = factory.createButton();btn.paint();}
}

4、协作
通常在运行时刻创建一个ConcreteFactory类的实例,这一具体的工厂创建具有特定实现的产品对象。为创建不同的产品对象,客户应使用不同的具体工厂。AbstractFactory将产品对象的创建延迟到它的ConcreteFactory子类
5、其优点和缺点
(1)它分离了具体的类。AbstractFactory模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离。它们不出现在客户代码中
(2)它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次,即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。
(3)它有利于产品的一致性。当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而AbstractFactory很容易实现这一点
(4)难以支持新种类的产品。难改扩展抽象工厂以生产新种类的产品。这是因为AbstractFactory接口确定了可以被创建的产品集合。支持新种类的产品就需要该工厂接口,这将涉及AbstractFactory类及其所有子类的改变。
6、实现
(1)将工厂作为单件。一个应用中一般每个产品系列只需要一个ConcreteFactory的实例。因此工厂通常最好实现为一个Singleton
(2)创建产品。AbstractFactory仅声明一个创建产品的接口,真正创建产品是由ConcreteProduct子类实现的。最通常的一个办法是为每一个产品定义一个工厂方法。一个具体的工厂将为每个产品重定义该工厂方法以指定产品。虽然这样的实现很简单,但它却要求每个产品系列都要有一个新的具体工厂子类,即使这些产品系列的差别很小。
(3)定义可扩展的工厂。AbstractFactory通常为每一种它可以生产的产品定义一个操作。产品的种类被编码在操作型构中。增加一种新的产品要求改变AbstractFacory的接口以及所有与它相关的类。一个更灵活但不太安全的设计是给创建对象的操作增加一个参数。该参数指定了将被创建的对象的种类。

设计模式之AbstractFactory相关推荐

  1. 自己看着视频的理解:设计模式之abstractfactory模式(2)

    抽象工厂模式的实现: 1.首先建立一个要生产产品的抽象工厂类,列出所要生产的抽象产品.(其产品都是设计时已经固定且都是互相依赖,不会改变的) abstract class DPFactory     ...

  2. 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型

    1.模式定义: 抽象工厂是应对产品族概念的,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 2.模式特点: 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工 ...

  3. 设计模式怎样解决设计问题

    1.6设计模式怎样解决设计问题 设计模式采用多种方法解决面向对象设计者经常碰到的问题.这里给出几个问题以及使用设计模式解决它们的方法. 1.6.1寻找合适的对象 面向对象程序由对象组成,对象包括数据和 ...

  4. UML建模工具-火龙果软件

     官网地址:http://code.uml.com.cn/index.asp     Bridge桥梁模式    (待逆向) 桥梁模式,通过增加一个类,将抽象部分与它的实现部分分离,使它们都可以独立 ...

  5. java面试宝典(综合知识)

    Java程序员面试题集 (对原有面试题集的答案进行了全面修订,参照了JDK最新版本,删除了重复题目以及EJB2.x等无用内容,补充最新面试题.知识点巩固练习题和经典面试编程题,增加了大型网站技术架构. ...

  6. Ogre 1.8 terrain 和 paging 组件

    以下转自:http://hi.baidu.com/xocoder/item/e8d87cf53d87612b753c4cfd OGRE地形生成 OGRE可以通过两个接口来生成地形,分别是void Te ...

  7. C++设计模式之二 AbstractFactory模式

    设计模式的目的就是尽量减少"变化"对程序的影响,尤其是对客户程序的影响.AbstractFactory模式作为创建型模式的一种,解决的就是"new"在变化中可能 ...

  8. C++设计模式-AbstractFactory抽象工厂模式

    AbstractFactory 要创建一组相关或者相互依赖的对象 作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. UML结构图: 抽象基类: 1)AbstractProdu ...

  9. 7.设计模式--抽象工厂模式(AbstractFactory模式)

    1.定义 抽象工厂模式也是一种创建型模型,是对工厂的一种抽象,可以理解为生产工厂的工厂.不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建,因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责 ...

最新文章

  1. 第十四周项目一-排序函数模版
  2. java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
  3. java重定向链接页面变小_java web的进来看一下!页面重定向的异常!帮忙看一下!谢谢了!...
  4. 将一个16进制数转化为10进制数
  5. 记一次面试过程中的Python编程题
  6. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (14) - 读存操作写存操作
  7. 飞船向上飞pygame用k_up_十分钟就能用Python教你开发出一个迷你打飞机的游戏
  8. 原力值13872,不知道排名多少
  9. .Top域名:新顶级域名还原互联网安全发展
  10. 【Python分子动力学】
  11. 计算机专业大学分数线低的,成绩徘徊在985、211分数线边缘,这4所大学考上容易,退档率极低...
  12. Java 断点续传以及在线视频播放可选择任一时间播放原理
  13. 弘辽科技:网店点击率低怎么办?点击率多少正常?
  14. iOS 7、iOS 8屏幕适配
  15. Elasticsearch之中文分词器插件es-ik的自定义热更新词库
  16. 计算机内无法使用搜狗,技巧:IE11无法使用搜狗输入法的原因及解决方法
  17. Python3 迁移怨声载道
  18. 简单的Winform秒表工具
  19. 《互联网金融投资理财一册通》一一1.1 互联网金融
  20. (附源码)springboot车辆管理系统 毕业设计031034

热门文章

  1. matlab数据接口技术,实战MATLAB之文件与数据接口技术
  2. python在中小学教学中的应用-小学信息技术教学中进行Python 编程语言教学的策略...
  3. python小项目实例流程-Python小项目:快速开发出一个简单的学生管理系统
  4. 数据分析软件python 对电脑的要求-用于数据分析的BI工具还是python?
  5. python官网地址-python官网地址
  6. python与excel做数据可视化-python操作Excel、读取CVS与数据可视化
  7. 重庆python培训-重庆Python培训班学完能做什么
  8. python好还是c语言好-初学者先学习python语言还是C语言
  9. python的运行窗口-在 Python 窗口中执行工具
  10. python下载图片-python下载百度图片,python图片下载程序