阅读目录

  • 使用频率:★★★★★
  • 一、什么是抽象工厂模式
  • 二、补充说明
  • 三、角色
  • 四、例子

使用频率:★★★★★

一、什么是抽象工厂模式

就是对一组具有相同主题的工厂进行封装(维基百科解释的很到位);

例如:生产一台PC机,使用工厂方法模式的话,一般会有cpu工厂,内存工厂,显卡工厂...但是使用抽象工厂模式的话,只有一个工厂就是PC工厂,但是一个PC工厂涵盖了cpu工厂,内存工厂,显卡工厂等要做的所有事;

二、补充说明

  • 注意这里的“相同主题”的概念,表示的是同一个产品族,不能将cpu工厂,面粉工厂封装成一个工厂,因为他们不属于同一个产品族;
  • 另外,还有一个产品等级的概念,还是以生产PC机为例,所谓的产品等级指的是不同厂商生产的CPU,如Intel和AMD的CPU,他们是同一个产品等级,如果只涉及产品等级的话,是不需要应用抽象工厂模式,使用工厂方法模式即可;
  • 工厂方法模式解决的范畴是产品等级(AMD处理器,Intel处理器等);抽象工厂模式解决的范畴是产品族等级(联想PC、惠普PC等);

三、角色

  • 抽象工厂
  • 具体工厂
  • 抽象产品
  • 具体产品
  • 产品使用者

说明:

  • 具体工厂“继承”抽象工厂;
  • 具体产品”继承“抽象产品;
  • 每个具体工厂(如PC工厂)包含若干个子工厂方法(如cpu工厂方法、显卡工厂方法...),子工厂方法负责生产对应的具体子产品,所有具体子产品(cpu、内存、显卡...)组合成一个具体产品(如惠普XXX型号PC);
  • 产品使用者使用每个具体工厂生产的具体产品;

四、例子

这里就不用PC这个例子了,继续前一个工厂模式的例子,在上一篇工厂模式的例子中,我们使用的是创建父亲对象这个例子,其中中国父亲和美国父亲指的就是同一个产品等级;

但是当我们要创建一个家庭对象的时候,需要创建父亲对象、母亲对象、孩子对象等等,所谓的父亲、母亲、孩子就构成了一个产品族,中国家庭、美国家庭就是产品族等级;这个时候就需要使用抽象工厂模式了;

类之间的关系图:

代码实现:

先创建抽象产品(抽象母亲、抽象父亲),具体产品(具体母亲、具体父亲):

package com.pichen.dp.creationalpattern.abstractfactory;public interface IMother {    public void printName();}
package com.pichen.dp.creationalpattern.abstractfactory;public interface IFather {    public void printName();}

package com.pichen.dp.creationalpattern.abstractfactory;public class ChineseMother implements IMother{    private String name;    public ChineseMother(String name) {        this.name = name;        System.out.println("create a cn mother.");    }    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }    @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.name);            }}

package com.pichen.dp.creationalpattern.abstractfactory;public class AmericanMother implements IMother{    private String name;    public AmericanMother(String name) {        this.name = name;        System.out.println("create a us mother.");    }    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }    @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.name);            }}

package com.pichen.dp.creationalpattern.abstractfactory;public class ChineseFather implements IFather{    private String name;    public ChineseFather(String name) {        this.name = name;        System.out.println("create a cn father.");    }    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }    @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.name);            }}

package com.pichen.dp.creationalpattern.abstractfactory;public class AmericanFather implements IFather{    private String name;    public AmericanFather(String name) {        this.name = name;        System.out.println("create a us father.");    }    /**     * @return the name     */    public String getName() {        return name;    }    /**     * @param name the name to set     */    public void setName(String name) {        this.name = name;    }    @Override    public void printName() {        System.out.println(this.getClass().getName() + ":" + this.name);            }}

创建一个抽象家庭工厂接口:

package com.pichen.dp.creationalpattern.abstractfactory;/** *  * abstract factory * father + mother + sister + ... = Product Family * cnfather + usfather + ukfather + ... = Product grade  //factory method * 〈功能详细描述〉 * @author    pi chen * @version   cp-lib V1.0.0, 2015年11月25日 * @see        * @since     cp-lib V1.0.0 */public interface IFamilyFactory {    public IFather createFather(String name);    public IMother createMother(String name);}

分别创建具体的中国家庭工厂和美国家庭工厂:

package com.pichen.dp.creationalpattern.abstractfactory;public class ChineseFamilyFactory implements IFamilyFactory{    @Override    public IFather createFather(String name) {        return new ChineseFather(name);    }    @Override    public IMother createMother(String name) {        return new ChineseMother(name);    }}

package com.pichen.dp.creationalpattern.abstractfactory;public class AmericanFamilyFactory implements IFamilyFactory{    @Override    public IFather createFather(String name) {        return new AmericanFather(name);    }    @Override    public IMother createMother(String name) {        return new AmericanMother(name);    }}

创面产品使用者main方法:

package com.pichen.dp.creationalpattern.abstractfactory;public class Main {    public static void main(String[] args) {        IFamilyFactory cnFamilyFactory = new ChineseFamilyFactory();        IFamilyFactory usFamilyFactory = new AmericanFamilyFactory();                IFather cnFather = cnFamilyFactory.createFather("cn father-test");        IMother cnMother = cnFamilyFactory.createMother("cn mother-test");                IFather usFather = usFamilyFactory.createFather("us father-test");        IMother usMother = usFamilyFactory.createMother("us mother-test");                cnFather.printName();        cnMother.printName();        usFather.printName();        usMother.printName();    }}

结果打印如下,功能正常:

create a cn father.
create a cn mother.
create a us father.
create a us mother.
com.pichen.dp.creationalpattern.abstractfactory.ChineseFather:cn father-test
com.pichen.dp.creationalpattern.abstractfactory.ChineseMother:cn mother-test
com.pichen.dp.creationalpattern.abstractfactory.AmericanFather:us father-test
com.pichen.dp.creationalpattern.abstractfactory.AmericanMother:us mother-test

抽象工厂模式_设计模式——抽象工厂模式相关推荐

  1. 组合模式_[设计模式]10.组合模式

    组合模式,也叫"部分整体模式",它把相似的对象组合成树形结构的一个整体.于是,只需一个代表,我们就能继续访问与之相关的同族对象. 模式卡片 模式UML图 七个例子 部门里人很多,大 ...

  2. java 肌汉模式_设计模式之原型模式详解(附源代码)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  3. 米线店结账程序 装饰着模式_设计模式——装饰者模式

    <Head First 设计模式> 学习笔记,码云同步更新中 如有错误或不足之处,请一定指出,谢谢~ 目录 查看其它设计模式笔记,点这里→设计模式笔记汇总 装饰者模式 定义: 动态地将责任 ...

  4. python 享元模式_设计模式-创建型模式,python享元模式 、python单例模式(7)

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...

  5. 过滤器用到了java哪个模式_设计模式之过滤器模式——Java语言描述

    过滤器模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 实现 创建一个Person对象.Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列 ...

  6. java 访问者模式_设计模式之访问者模式

    public interface Visitor { public void visitString(StringElement stringE); public void visitFloat(Fl ...

  7. 抽象工厂模式_设计模式系列—抽象工厂模式

    前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...

  8. 抽象工厂模式_设计模式(3) 抽象工厂模式

    抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式.简单工厂的职责非常简单:构造某个实体类型,然后把实例作为抽象类型返回: 工厂方法模式则进一步抽象出 ...

  9. java抽象工厂模式_JAVA设计模式-抽象工厂模式

    定义 抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构. 抽象工厂模 ...

最新文章

  1. 如何避免Java中的回调“地狱”
  2. C++_标准模板库STL概念介绍5-其他库与总结
  3. TestNG 自动化测试入门教程--典型示例
  4. 红帽7 -本地yum配置
  5. 在Ubuntu上安装SAP Cloud Connector的一些错误
  6. 蓝桥杯 ADV-202算法提高 最长公共子序列(动态规划)
  7. linux远程备份视频教程,linux实现自动远程备份(scp+ssh)
  8. 利用Word2010在博客园发布文章入门
  9. 深入研究RocketMQ生产者发送消息的底层原理
  10. SimpleDateFormat-多线程问题
  11. Java项目:博客系统西瓜社区(springboot+mybatis-plus+thymeleaf)
  12. Android键盘 AOSP监听delete按键
  13. Java大作业——手把手教你写俄罗斯方块
  14. android 文本滚动显示,Android 文本内容滚动显示
  15. 后台集成解决方案 avue
  16. 漫谈自动化测试(一)——如何入门
  17. ABAP 设置鼠标光标
  18. 博弈论系列—海盗分金币
  19. ideal springboot class not found 解决办法
  20. python模拟输入文本内容(打破复制粘贴限制)

热门文章

  1. java xml date_W3C XML 模式时间数据类型与java Date进行转换
  2. 室内定位算法_001:室内定位算法技术咨询服务工作室简介(更新)
  3. java文件 linux_Linux执行Java文件
  4. unity 彩带粒子_iOS动画开发----粒子系统---彩带效果
  5. 微人事项目实战的数据库脚本_EMP微前端实战之cocos2d线上项目
  6. 哈哈机器人送到冰雪小镇_从小镇到上海:两代人的接力洄游 | 活动回顾
  7. php-fpm初始化失败,FPM的初始化 - [ PHP7的内核剖析 ] - 在线原生手册 - php中文网
  8. Oracle数据库查询优化
  9. 安装LibreOffice和字体
  10. linux tips 技巧笔记二