1.设计意图

提供一个接口,用于创建相关或者从属对象的族,而不是指定他们的具体类。以下以生产计算机为例给出UML类图:

2.演示案例

假设我们要生产一台计算机(广义的),一台计算机有一些共同的物件。小型计算机(以手机为例)需要有触控屏、微处理器和小型化的内存条。大型计算机(以PC机为例)需要有显示屏、多核处理器和内存条。计算机的各个部件存在着相互依赖关系。

简而言之

抽象工厂即工厂的工厂,它将单独但相关/依赖的工厂分组在一起而不是指定具体类别的工厂。

维基百科:

抽象工厂模式提供了一种方法来封装一组具有共同主题的单个工厂,而不指定它们的具体类。

3.代码示例

以上述的生产计算机为案例,首选我们需要定义一些部件接口并实现这些部件接口

Memory.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:23 * @modify by : * @info:[内存接口类] * @since: */public interface Memory { String getDescription();}

Screen.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:22 * @modify by : * @info:[屏幕接口类] * @since: */public interface Screen { String getDescription();}

Processor.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:24 * @modify by : * @info:[处理器接口类] * @since: */public interface Processor { String getDescription();}

PhoneMemory.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:28 * @modify by : * @info:[手机内存类] * @since: */public class PhoneMemory implements Memory{ static final String DESCRIPTION = "This is phone memory"; @Override public String getDescription() { return DESCRIPTION; }}

PhoneScreen.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:26 * @modify by : * @info:[手机屏幕类] * @since: */public class PhoneScreen implements Screen{ static final String DESCRIPTION = "This is phone screen"; @Override public String getDescription() { return DESCRIPTION; }}

PhoneProcessor.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:29 * @modify by : * @info:[手机处理器类] * @since: */public class PhoneProcessor implements Processor{ static final String DESCRIPTION = "This is phone processor"; @Override public String getDescription() { return DESCRIPTION; }}

ComputerMomory.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:38 * @modify by : * @info:[电脑内存条] * @since: */public class ComputerMemory implements Memory{ static final String DESCRIPTION = "This is computer memory"; @Override public String getDescription() { return DESCRIPTION; }}

ComputerScreen.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:36 * @modify by : * @info:[电脑屏幕] * @since: */public class ComputerScreen implements Screen{ static final String DESCRIPTION = "This is computer screen"; @Override public String getDescription() { return DESCRIPTION; }}

ComputerProcessor.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:39 * @modify by : * @info:[电脑处理器] * @since: */public class ComputerProcessor implements Processor{ static final String DESCRIPTION = "This is computer processor"; @Override public String getDescription() { return DESCRIPTION; }}

然后,我们定义一个抽象的电子产品生产工厂类并创建两个它的实现类:

ElectronicFactory.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:32 * @modify by : * @info:[电子设备生产工厂接口类] * @since: */public interface ElectronicFactory { /** * 生产屏幕 * @return */ Screen produceScreen(); /** * 生产内存条 * @return */ Memory produceMemory(); /** * 生产处理器 * @return */ Processor produceProcessor();}

ComputerFactory.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:40 * @modify by : * @info:[电脑生产工厂] * @since: */public class ComputerFactory implements ElectronicFactory{ @Override public Screen produceScreen() { return new ComputerScreen(); } @Override public Memory produceMemory() { return new ComputerMemory(); } @Override public Processor produceProcessor() { return new ComputerProcessor(); }}

PhoneFactory.java

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-2:35 * @modify by : * @info:[手机生产工厂] * @since: */public class PhoneFactory implements ElectronicFactory{ @Override public Screen produceScreen() { return new PhoneScreen(); } @Override public Memory produceMemory() { return new PhoneMemory(); } @Override public Processor produceProcessor() { return new PhoneProcessor(); }}

现在我们已经拥有了一个抽象的工厂,它可以让我们生产相关的电子产品部件,即手机工厂可以生产手机屏幕、手机处理器和手机内存条,同样电脑工厂可以生产电脑显示器、电脑内存条和电脑处理器等。我们来简单的测试一下:

public class SimpleTest { public static void main(String[] args){ ElectronicFactory factory = new PhoneFactory(); Screen screen = factory.produceScreen(); Memory memory = factory.produceMemory(); Processor processor = factory.produceProcessor(); System.out.println(screen.getDescription()+""+memory.getDescription()+""+processor.getDescription()); }}

控制台输出:

现在,我们可以为不同的电子产品生产工厂设计一个工厂,即工厂的工厂。本例子中,我们创建一个FacotryMaker类,负责返回PhoneFactory或者ComputerFactory,客户端可以通过FactoryMacker工厂来创建所需的工厂,进而生产不同的电子产品部件(屏幕、处理器、内存条)。

首先定义一个枚举类型的类FactoryType,用于给FactoryMacker提供选择参考:

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-4:16 * @modify by : * @info:[工厂类型] * @since: */public enum FactoryType { PHONE,COMPUTER;}

然后定义一个生产工厂的工厂类FactoryMacker:

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-4:16 * @modify by : * @info:[工厂创建器:工厂的工厂] * @since: */public class FactoryMacker { /** * 此工厂方法负责创建具体的工厂类 * @param type * @return */ public static ElectronicFactory makeFactory(FactoryType type){ switch (type){ case PHONE: return new PhoneFactory(); case COMPUTER: return new ComputerFactory(); default: throw new IllegalArgumentException("FactoryType not supported."); } }}

最后,我们定义一个AbstractFactory类来封装上述的单个工厂类:

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-4:21 * @modify by : * @since: */public class AbstractFactory { private Screen screen; private Memory memory; private Processor processor; public void createFactory(final ElectronicFactory factory){ setScreen(factory.produceScreen()); setMemory(factory.produceMemory()); setProcessor(factory.produceProcessor()); } public Screen getScreen() { return screen; } private void setScreen(Screen screen) { this.screen = screen; } public Memory getMemory() { return memory; } private void setMemory(Memory memory) { this.memory = memory; } public Processor getProcessor() { return processor; } private void setProcessor(Processor processor) { this.processor = processor; }}

现在,整个抽象工厂模式案例已经全部实现。最后测试一下我们创建的抽象工厂模式案例:

package com.ramostear.pattern.abstractfactory;/** * @author ramostear * @create-time 2019/1/5 0005-4:27 * @modify by : * @info:[对抽象工厂进行测试] * @since: */public class TestAbstractFactory { public static void main(String[] args){ AbstractFactory factory = new AbstractFactory(); System.out.println("produce phone..."); factory.createFactory(FactoryMacker.makeFactory(FactoryType.PHONE)); System.out.println(factory.getScreen().getDescription()); System.out.println(factory.getMemory().getDescription()); System.out.println(factory.getProcessor().getDescription()); System.out.println("produce computer..."); factory.createFactory(FactoryMacker.makeFactory(FactoryType.COMPUTER)); System.out.println(factory.getScreen().getDescription()); System.out.println(factory.getMemory().getDescription()); System.out.println(factory.getProcessor().getDescription()); }}

控制台输出:

4.适用性

当满足以下场景时适合适用抽象工厂模式

  • 系统应该独立于其产品的创建、组成和表示方式
  • 一个系统应该配置多个产品系列中的一个
  • 相关产品对象的系列设计为一起使用,您需要强制执行此约束
  • 您希望提供产品的类库,并且只显示它们的接口,而不显示它们的实现
  • 您需要一个运行时值来构造一个特定的依赖项
  • 您需要提供一个或多个仅在运行时已知的参数,然后才能解析依赖项

抽象工厂模式java_Java之抽象工厂模式(Abstract Factory)相关推荐

  1. 工厂模式 java_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  2. 组合模式 桥接模式 java_java设计模式5.组合模式、门面模式、享元模式、桥接模式...

    组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...

  3. 访问者模式 java_java设计模式之访问者模式

    写这篇文章之前,我也看了十几篇网络大牛写的访问者设计模式的文章,都说这个访问者模式是最复杂的一个,但是我觉得跟其他的设计模式并没有太多的不同,因此自己整理了一下,相信大多数人都能看懂. 一.认识访问者 ...

  4. 命令模式 java_JAVA中的命令模式实例教程

    原文链接  作者:Pankaj Kumar 译者:f0tlo <1357654289@qq.com> 命令模式是一种行为模式,因此,它处理的是对象的行为.命令模式为系统中不同的对象提供中性 ...

  5. 建造者模式java_java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  6. 抽象工厂模式java_Java描述设计模式(04):抽象工厂模式

    一.抽象工厂模式 1.生活场景 汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂. 2.抽象工厂模式 1) 抽象工厂模式:定义了一 ...

  7. 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...

    在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV, ...

  8. 编程模式 之美 -- 抽象工厂模式

    文章目录 1. 解决问题 2. 应用场景 3. 实现如下: C++实现 C语言实现 4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服.此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建 ...

  9. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

最新文章

  1. JAVA中File类的使用
  2. [转]SQL Server 2000执行计划成本(1/5)
  3. 鹤峰:美丽的茶乡—— 山水篇
  4. python webdriver 常用元素操作
  5. Redis-benchmark测试Redis性能
  6. 横幅新年促销海报PSD模板,拯救年底节日忙
  7. Linux服务器配置和管理:虚拟机安装CentOS6.7
  8. mysql 获取select结果_php如何操作mysql获取select 结果
  9. python实践项目(八)
  10. Winform 分页用户自定义控件( ML.Pager.WinControl)
  11. 'gbk' codec can't encode character解决方法
  12. 机器学习- 吴恩达Andrew Ng Week8 知识总结 Dimensionality Reduction
  13. http抓包实践--(五)-常用的操作
  14. HTML5期末大作业:学校网站设计——初级中学网站(16页)HTML+CSS+JavaScript 学校网页设计作业 网页设计作业 学生个人设计成品,网页设计作业
  15. 西威变频器avo下载调试资料_双色图解变频器及软起动器控制线路
  16. 免费配音软件有哪些?分享三款好用的软件,帮你完成短视频配音
  17. 数据分析最常用的excel函数公式大全
  18. 北京计算机研究所面试流程,中科院计算所霸面经历
  19. js实现当日期转农历日期
  20. 花了几天时间,总结了一份Python工程师的职业成长路径图

热门文章

  1. canvas - 饼状图
  2. 安装了ubuntu14.04+windows7双系统的笔记本启动后出现grub rescue提示符
  3. KGmailNotifier-Gmail 邮件关照轨范
  4. 时间管理读后记(二)
  5. ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题
  6. DataGridView 中发生以下异常: System.Exception: 是 不是 Decimal 的有效值。 ---> System.FormatException: 输入字符串的格式不正确。
  7. mysql删除数据后id自增不连续的解决方法
  8. python3的urllib2报错问题解决方法
  9. jmeter发送json数据,报405、400错误解决方案
  10. Android Retrofit+RxJava 优雅的处理服务器返回异常、错误