一、概述

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

二、适用性

1.一个系统要独立于它的产品的创建、组合和表示的时候。

2.一个系统要由多个产品系列中的一个来配置的时候。

3.当你要强调一系列相关的产品对象的设计以便进行联合使用的时候。

4.当你提供一个产品类库,而只想显示它们的接口而不是实现的时候。

三、参与者

1.AbstractFactory:声明一个创建抽象产品对象的操作接口。

2.ConcreteFactory:实现创建具体产品对象的操作。

3.AbstractProduct:为一类产品对象声明一个接口。

4.ConcreteProduct:定义一个将被相应地具体工程创建的产品对象。实现AbstractProduct接口。

5.Client:仅使用由AbstractFactory和AbstractProduct类声明的接口。

四、类图

五、示例

AbstractFactory

  1. package cn.lynn.abstractfactory;
  2. public interface IAnimalFactory {
  3. public IMouse createMouse();
  4. public ICat createCat();
  5. }

ConcreteFactory

  1. package cn.lynn.abstractfactory;
  2. public class WhiteAnimalFactory implements IAnimalFactory {
  3. @Override
  4. public IMouse createMouse() {
  5. return new WhiteMouse();
  6. }
  7. @Override
  8. public ICat createCat() {
  9. return new WhiteCat();
  10. }
  11. }
  1. package cn.lynn.abstractfactory;
  2. public class BlackAnimalFactory implements IAnimalFactory {
  3. @Override
  4. public IMouse createMouse() {
  5. return new BlackMouse();
  6. }
  7. @Override
  8. public ICat createCat() {
  9. return new BlackCat();
  10. }
  11. }

AbstractProduct

  1. package cn.lynn.abstractfactory;
  2. public interface IMouse {
  3. public void eat();
  4. }
  1. package cn.lynn.abstractfactory;
  2. public interface ICat {
  3. public void eat();
  4. }

ConcreteProduct

  1. package cn.lynn.abstractfactory;
  2. public class WhiteMouse implements IMouse {
  3. @Override
  4. public void eat() {
  5. System.out.println("白老鼠偷吃花生!");
  6. }
  7. }
  1. package cn.lynn.abstractfactory;
  2. public class BlackMouse implements IMouse {
  3. @Override
  4. public void eat() {
  5. System.out.println("黑老鼠偷吃花生!");
  6. }
  7. }
  1. package cn.lynn.abstractfactory;
  2. public class WhiteCat implements ICat {
  3. @Override
  4. public void eat() {
  5. System.out.println("白猫贪吃咸鱼!");
  6. }
  7. }
  1. package cn.lynn.abstractfactory;
  2. public class BlackCat implements ICat {
  3. @Override
  4. public void eat() {
  5. System.out.println("黑猫贪吃咸鱼!");
  6. }
  7. }

Client

  1. package cn.lynn.abstractfactory;
  2. public class Client {
  3. public static void main(String[] args) {
  4. IAnimalFactory whiteAnimalfactory = new WhiteAnimalFactory();
  5. IMouse whiteMouse = whiteAnimalfactory.createMouse();
  6. whiteMouse.eat();
  7. ICat whiteCat = whiteAnimalfactory.createCat();
  8. whiteCat.eat();
  9. IAnimalFactory blackAnimalfactory = new BlackAnimalFactory();
  10. IMouse blackMouse = blackAnimalfactory.createMouse();
  11. blackMouse.eat();
  12. ICat blackCat = blackAnimalfactory.createCat();
  13. blackCat.eat();
  14. }
  15. }

Result

    1. 白老鼠偷吃花生!
    2. 白猫贪吃咸鱼!
    3. 黑老鼠偷吃花生!
    4. 黑猫贪吃咸鱼!

GoF23种设计模式之创建型模式之抽象工厂模式的更多相关文章

  1. GoF23种设计模式之创建型模式之原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.适用性 1.当一个系统应该独立于它的产品创建.构成和表示的时候. 2.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...

  2. GoF23种设计模式之创建型模式之工厂方法模式

    一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...

  3. GoF23种设计模式之创建型模式之建造者模式

    一.概述 将一个复杂对象的构建与其表示分离开来,使得同样的构建过程可以创建不同的表示. 二.适用性 1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式的时候. 2.当构造过程必须允许 ...

  4. GoF23种设计模式之创建型模式之单态模式

    1概述 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2适用性 1.当类只能有一个实例而且客户可以从一个总所周知的访问点访问它的时候. 2.当这个唯一实例应该是通过子类化可扩展的,并且客户应 ...

  5. Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)

    一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...

  6. java设计模式 -------- 创建模式 之 抽象工厂模式

    本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...

  7. [19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)

    一.工厂模式(分为:简单工厂模式.工厂方法模式.抽象工厂模式) 实现了创建者和调用者的分离 核心本质:1.实例化对象,用工厂方法代替new操作:2.将选择实现类.创建对象统一管理和控制,从而将调用者跟 ...

  8. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  9. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

随机推荐

  1. Linux系统配置双网卡绑定bond0

    1.bonding简述 双网卡配置设置虚拟为一个网卡实现网卡的冗余,其中一个网卡坏掉后网络通信仍可正常使用,实现网卡层面的负载均衡和高可用性.现在一般的企业都会使用双网卡接入,这样既能添加网络带宽,同 ...

  2. Spark Mllib里的如何对两组数据用皮尔逊计算相关系数

    不多说,直接上干货! import org.apache.spark.mllib.stat.Statistics 具体,见 Spark Mllib机器学习实战的第4章 Mllib基本数据类型和Mlli ...

  3. Spring Cloud微服务初探

    学习初衷 因为加了不少优秀的知识星球,结交了更多的小伙伴,加了更多的群,每每在自我介绍的时候,都说自己是Android & Java攻城狮. 然鹅,有的小伙伴就来问了,你是搞Java的,那对S ...

  4. mac-httpd

    mac 的httpd mac 自带了apache2, 但是不推荐使用, 因为它的目录在/Library/WebServer/Documents/下 使用brew install apache-http ...

  5. C# 多线程之线程池

    线程池System.Threading.ThreadPool,可用于发送工作项.处理异步I/O.代表其它线程等待以及处理计时器.基本用法: public void Main() { ThreadPoo ...

  6. Linux系统 Centos7/Centos6.8 yum命令在线安装 MySQL5.6

    Linux系统 Centos7 yum命令在线安装 MySQL5.6 标签: centosmysqlyum 2015-11-18 17:21 707人阅读 评论(0) 收藏 举报  分类: Linux ...

  7. meterpreter > ps

    meterpreter > ps Process List============ PID PPID Name Arch Session User Path --- ---- ---- ---- ...

  8. cms-最近更新

    在这一讲中有几个很重要的地方需要注意: 1.在查询帖子的时候需要把帖子类型id带到帖子类型表中把类型查询出来 2.在字帖子查询语句中用limt限制查询那个阶段的帖子 3.在界面显示的时候需要用到字符串 ...

  9. UVA Stacks of Flapjacks 栈排序

    题意:给一个整数序列,输出每次反转的位置,输出0代表排序完成.给一个序列1 2 3 4 5,这5就是栈底,1是顶,底到顶的位置是从1~5,每次反转是指从左数第i个位置,将其及其左边所有的数字都反转,假 ...

  10. Aizu 2456 Usoperanto (贪心)

    贪心,对于一个修饰关系可以连一条有向边,在合并的时候,子节点的序列一定是连续安排的,因为如果有交叉,交换以后一定更优. 然后一个序列一个序列的考虑,长度短的应该在前面,否则同样交换以后更优.因此排序以 ...