一、概述

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

二、适用性

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. java里如何实现两个等长度的字符串数组有多少个元素相同(从最左边开始,一旦遇到不同元素则跳出计数)

    不多说,直接上干货! package zhouls.bigdata.DataFeatureSelection.sim; public class test { public static int st ...

  2. 4 - Channelhandler和ChannelPipeline

    4.1 Channelhandler 4.1.1 Channel声明周期(状态事件) 方法 描述 ChannelUnregistered Channnel已创建,但是未注册到EventLoop Cha ...

  3. pat1059. Prime Factors (25)

    1059. Prime Factors (25) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 HE, Qinming Given ...

  4. CentOS 6.2安装nagios

    nagios分为监控机和被监控机两类机器      监控主机:gserver150(192.168.111.150) 被监控主机:gserver151(192.168.111.151)   一.  监 ...

  5. DBTransaction

    // Created by 张国锋 on 15-7-23. // Copyright (c) 2014年 张国锋. All rights reserved. // #import "AppD ...

  6. LVS 集群工作原理

    1. 集群:集群(cluster )就是一组计算机,它们作为一个整体向用户提供一组网络资源,单个计算机系统就是一个集群节点(node). 2. 集群种类: <1>. 负载均衡集群(Load ...

  7. 十分钟玩转 jQuery、实例大全(参考自博主索宁)

    十分钟玩转 jQuery.实例大全(参考自博主索宁) 一.简介 书写规则 支持链式操作: 在变量前加"$"符号(var $variable = jQuery 对象): 注:此规定并 ...

  8. Cypress测试工具

    参考博客:  https://testerhome.com/articles/19035 最近一段时间学习了cypress的测试工具, 她是一个端到端的测试web工具. 环境准备 1.工具:vs co ...

  9. UGUI的事件系统分析

    UGUI的源码还是非常清晰的,打开源码可以发现, 从UGUI的源码可知:在EventSystem中调用每一帧函数来实现: private void TickModules() { for (var i ...

  10. memcached for .net on windows

    memcached for windowshttp://www.cnblogs.com/dudu/archive/2009/07/19/1526407.htmlhttp://www.cnblogs.c ...