转载自:https://www.cnblogs.com/chenpi/p/5156801.html (风一样的码农)

阅读目录

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

使用频率:★★★★★

一、什么是抽象工厂模式

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

例如:生产一台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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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{@Overridepublic IFather createFather(String name) {return new ChineseFather(name);}@Overridepublic IMother createMother(String name) {return new ChineseMother(name);}}

package com.pichen.dp.creationalpattern.abstractfactory;public class AmericanFamilyFactory implements IFamilyFactory{@Overridepublic IFather createFather(String name) {return new AmericanFather(name);}@Overridepublic 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

转载于:https://www.cnblogs.com/chz-blogs/p/9380977.html

设计模式(十)------23种设计模式(3):抽象工厂模式相关推荐

  1. Java设计模式:23种设计模式全面解析,墙都不扶就服你

    命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化. 迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构. 观察者模式:对象间的一对多的依赖关系. 仲裁者模式: ...

  2. 一文总结三大设计模式(23种设计模式)

    昨天我们介绍了设计模式的七大原则,今天我们介绍一下设计模式中的三大分类具体23种设计模式. 总述 三大设计模式 三大设计模式分别是:创建型.结构型.行为型三种 创建型模式主要用于描述如何创建对象(5种 ...

  3. 设计模式详解(四)抽象工厂模式

    文章目录 1. 简介 2. 代码实例 3. 抽象工厂的优缺点 1. 简介 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类 与工厂方法模式不同(工厂方法的升级,在工厂方法模式 ...

  4. 浅谈设计模式之单例模式、适配器模式、抽象工厂模式

    带你读懂几种常见的设计模式 第三弹 本文已经是设计模式系列的第三篇文章了,今天来讲讲单例模式.抽象工厂模式和适配器模式. 1.单例模式 单例模式让一个类最多只有一个实例.具体的做法是: 让类的构造方法 ...

  5. 设计模式(三):旅行的角度理解抽象工厂模式

    之前的文章介绍了工厂模式,这篇文章介绍工厂模式的强化版本抽象工厂模式(Abstract Factory Pattern) . 我们知道工厂模式是用于在延迟创建具体的对象,抽象工厂模式可以看作是面向工厂 ...

  6. JAVA设计模式是个什么玩意儿_02_抽象工厂模式

    1. 定义 2. 思路 抽象工厂模式是工厂方法模式的进一步抽象,为创建一组相关或相互依赖的对象提供一个接口,无需指定它们的具体类.抽象工厂通常用于创一族产品,并且这组产品分不同的等级,不同的工厂生产不 ...

  7. 追MM与设计模式(23种设计模式巧妙解析,趣味理解)--微信公众号(程序员共读)

    创建型模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说"来四个鸡翅"就 ...

  8. 【设计模式】23种设计模式之模板方法模式

    模板方法模式 定义 在一个抽象基类的方法中定义一个算法的骨架,算法的每一个步骤都可以延迟到子类,由子类重写.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤. UML类图 使用场 ...

  9. 【JAVA长虹键法】第一式 初识设计模式(23种设计模式)

  10. 23种设计模式-抽象工厂模式《三国王者》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 定义: 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体 ...

最新文章

  1. 两个数据库字符集不一样,如何快速增量同步数据.
  2. 爬虫技术python代码_Python 你见过三行代码的爬虫吗
  3. mysql事务 可见性,【每日阅读】2020年12月09日-事务先后的可见性
  4. C#算数运算符、关系运算符、逻辑运算符、语句
  5. THUSC2019游记
  6. im2col函数解析
  7. linux实现多台服务器文件同步
  8. iconv的用法,'GBK'转'utf-8'
  9. SketchUp Pro2019注册机|草图大师SketchUp Pro 2019注册破解补丁下载(附SketchUp Pro 2019许可证)
  10. 微信小程序 下拉刷新 上拉触底分页
  11. java-se-包装类
  12. Jenkins和Docker在HULK的落地实践
  13. 华为/荣耀 Magicbook/Matebook 开机经常弹出华为智能还原
  14. anconda各个版本下载
  15. 终于有一款视频社交应用打破微信的榜首垄断了,Faceu再登Appstore总榜第一
  16. JETT(一)-Excel模板转换器简介
  17. 【第4天】尊重是最有力的征服
  18. linux+cs1.6服务器搭建,Linux玩CS反恐精英的方法
  19. 卜若的代码笔记-matlab系列-matlab基础教程-第二章:静态变量
  20. keydown与keypress的区别,组合键

热门文章

  1. 20个最强的基于浏览器的在线代码编辑器 - OPEN资讯
  2. Symfony1.4.11学习笔记(一):设置环境
  3. Programming WCF Services翻译笔记(五)
  4. 已经导入依赖,但是Cannot resolve symbol“registerFunction“
  5. Freenom.com的域名+github pages+netlify的CDN加速
  6. redis+celery+django设置外网可访问
  7. pg_config executable not found
  8. gevent-tutorial翻译和解读
  9. clion的project区的字体以及自动排版的快捷键修改
  10. 运行的Cython的3种方法