文章目录

  • 1. 简介
  • 2. 代码实例
  • 3. 抽象工厂的优缺点

1. 简介

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类

与工厂方法模式不同(工厂方法的升级,在工厂方法模式中每个实际的工厂只定义了一个工厂方法),抽象工厂模式能够应对更加复杂的产品族系,它更类似于一种对“工业制造标准”的制定与推行,各工厂实现都遵循此标准来进行生产活动,有M个产品系列就应该有M个实现工厂类,在每个实现工厂中,实现不同产品族的生产任务,达到无限扩展产品的目的

总的来说,一个工厂完成一系产品(A1 B1是1个系列)的加工,在一个工厂内部,根据方法的不同来区分不同类产品的加工(比如A1 B1不同类同系)

2. 代码实例

以和设计模式详解(三)工厂模式中的造人例子类似,现在引入以下场景:

在三中,是创建黑白黄三种人,现在要求再加入一个性别分类,即黑白黄+男女,一共六种,如果按照工厂方法来的话,需要创建6个子类和6个工厂,实现类太多,如果后面还需要加入其他的分类条件,可以会出现组合爆炸的情况,因此采用抽象工厂模式的类图如下:

package designpattern;
/** * 人类抽象类*/
abstract class Human {public abstract void color();public abstract void talk();}
abstract class BlackHuman extends Human{@Overridepublic void color() {System.out.println("我的皮肤是黑色");}abstract public void talk();
}
abstract class YellowHuman extends Human{@Overridepublic void color() {System.out.println("我的皮肤是黄色");}abstract public void talk();
}
abstract class WhiteHuman extends Human{@Overridepublic void color() {System.out.println("我的皮肤是白色");}abstract public void talk();
}
class FemaleBlackMan extends BlackHuman{@Overridepublic void talk() {System.out.println("我是黑人女性");}}
class FemaleWhiteMan extends WhiteHuman{@Overridepublic void talk() {System.out.println("我是白人女性");}}
class FemaleYellowMan extends YellowHuman{@Overridepublic void talk() {System.out.println("我是黄人女性");}}
class MaleBlackMan extends BlackHuman{@Overridepublic void talk() {System.out.println("我是黑人男性");}}
class MaleWhiteMan extends WhiteHuman{@Overridepublic void talk() {System.out.println("我是白人男性");}}
class MaleYellowMan extends YellowHuman{@Overridepublic void talk() {System.out.println("我是黄人男性");}}
interface HumanFactory{public Human createBlackHuman();public Human createWhiteHuman();public Human createYellowHuman();
}
class FemaleHumanFactory implements HumanFactory{@Overridepublic Human createBlackHuman() {return new FemaleBlackMan();}@Overridepublic Human createWhiteHuman() {return new FemaleWhiteMan();}@Overridepublic Human createYellowHuman() {return new FemaleYellowMan();}}
class MaleHumanFactory implements HumanFactory{@Overridepublic Human createBlackHuman() {return new MaleBlackMan();}@Overridepublic Human createWhiteHuman() {return new MaleWhiteMan();}@Overridepublic Human createYellowHuman() {return new MaleYellowMan();}}
public class AbstractFactoryDemo {public static void main(String[] args) {//男性生产线HumanFactory maleHumanFactory=new MaleHumanFactory();//女性生产线HumanFactory femaleHumanFactory=new FemaleHumanFactory();Human maleBlack=maleHumanFactory.createBlackHuman();//创建黑人男性Human femaleWhite=femaleHumanFactory.createWhiteHuman();//创建白人女性maleBlack.color();maleBlack.talk();femaleWhite.color();femaleWhite.talk();}
}

上面的代码中,分为

3. 抽象工厂的优缺点

优点:

  • 封装性。每个产品的实现类不是高层模块要关心的,它要关心的是接口
  • 产品族内的约束为非公开状态

缺点:

  • 产品族扩展非常困难。如果要增加一个产品C,也就是说产品家族由原来的2个增加到3个,抽象类AbstractCreator要增加一个方法createProductC(),然后之前的两个实现类都要修改

产品族(人的肤色)扩展困难,而不是产品等级(性别):比如再增加一个第三性别X,则要增加三个产品类,分别对应性别X下不同的肤色,然后再创建一个工厂类。这是比较简单的;

但是如果再增加一个棕色人(族),则需要在抽象工厂中添加一个生产棕色人种方法,并且要修改之前已经实现抽象类的两个具体类,违反了开闭原则,问题的本质在于工厂内部用不同的方法区别于不同的族,增加族就要改变抽象工厂内部的方法

设计模式详解(四)抽象工厂模式相关推荐

  1. C++设计模式详解之抽象工厂模式解析

    抽象工厂模式概念 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类 抽象工厂模式实例 以组装电脑为例,一般来说,电脑组装都不可能是一家公司的零件,简单的来说,显卡就有NVIDIA和A ...

  2. 设计模式详解:抽象工厂模式

    今天我们来看一下另一个使用频率非常高的抽象工厂模式,看完原理分别给出.NET和JAVA两种语言的实现源码. 定义: 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类. ...

  3. 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...

  4. 【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝

    目录 说明 实现方式 自问自答 其他链接 说明 五大创建型模式之一,其他还有单例模式.原型模式.建造者模式.工厂模式. 抽象工厂模式(Abstract Factory Pattern):定义了一个in ...

  5. 《设计模式详解》创建型模式 - 工厂模式

    <设计模式详解> 4.2 工厂模式 4.2.1 概述 4.2.2 简单工厂模式 4.2.2.1 结构 4.2.2.2 实现 4.2.2.3 优缺点 4.2.2.4 扩展 - 静态工厂 4. ...

  6. 工厂模式详解(简单工厂模式,工厂方法模式,抽象工厂模式,只给出抽象工厂模式具体代码)

    1.简单工厂模式(Factory) 应用场景:又叫做静态工厂方法(StaticFactory Method)模式,但不属于 23 种设计模式之一.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决 ...

  7. 《设计模式详解》行为型模式 - 状态模式

    状态模式 6.5 状态模式 6.5.1 反例 6.5.2 结构 6.5.3 案例实现 6.5.4 优缺点 6.5.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 行为型 ...

  8. 《设计模式详解》行为型模式 - 模板方法模式

    模板方法模式 6.1 模板方法模式 6.1.1 概述 6.1.2 结构 6.1.3 案例实现 6.1.3 优缺点 6.1.4 适用场景 6.1.5 JDK源码 - InputStream 完整的笔记目 ...

  9. 《设计模式详解》结构型模式 - 代理模式

    代理模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 动态代理 JDK 动态代理 JDK 动态代理分析 CGLIB 动态代理 5.1.5 三种代理的对比 5 ...

  10. 《设计模式详解》创建型模式 - 建造者模式

    建造者模式 4.4 建造者模式 4.4.1 概述 4.4.2 结构 4.4.3 实例 4.4.4 优缺点 4.4.5 使用场景 4.4.6 扩展 - 构建对象 重构前 重构后 4.5 创建型模式对比 ...

最新文章

  1. ffmpeg推送图片到流媒体服务器
  2. boost::mp11::mp_count_if_q相关用法的测试程序
  3. 为SQLMap配置WebUI界面
  4. sendData to ABAP backend via multiple form content type
  5. 自训练:超越预训练,展现强大互补特性的上分新范式!
  6. 为何程序C语言不会消亡?程序员学习C会白学吗?
  7. FreeTextBox 3.1.6 的实践总结和几个问题
  8. 面向对象方法及软件工程——团队答辩
  9. 运维堡垒机(跳板机)系统 python
  10. h5 前端 PHP,十分钟搞定微信H5支付(ThinkPHP5.1)
  11. 4400php兑换美金是多少,美金换算人民币怎么算(美金换人民币怎样计算)
  12. linux宕机故障分析案例,[文章]Linux宕机故障分析案例
  13. 【C++ Primer】第十章 泛型算法 (练习)
  14. 操作成功的提示信息动态添加
  15. 复数的概念及运算(复变函数)
  16. 笔记本电脑如何用c语言开无线网卡,笔记本电脑无线上网卡怎么用 笔记本电脑无线上网卡使用方法...
  17. fpga驱动rgb液晶屏_用FPGA设计LCD 转 VGA 其实vga和lcd驱动 非常类似
  18. (课程学习笔记)Excel学习
  19. ca加密是什么情况_让我们进行加密:为什么要创建一个免费,自动化和开放的CA?...
  20. LeetCode160.相交链表

热门文章

  1. SqlServer数据库定时备份
  2. java dateutils_Java中简单日期工具类DateUtils的实现
  3. OpenGL超级宝典(第7版)之第十一章高级数据管理
  4. CCNP-BSCI的实验环境dynamips(dynagen)版本
  5. git中出现”the requested upstream branch ‘origin/master‘ does not exist“问题的解决
  6. Eclipse中CVS界面功能描述(一)
  7. java生成32位流水号,Java生成流水号
  8. vue echarts使用map地图 引入china.js报错Cannot read property ‘echarts’ of undefined
  9. 最新广东省知识产权贯标奖励及补助政策汇总大全,包括广州、深圳等
  10. arcgis两张图层不能同时显示_如何在ArcGIS中合并两个“不兼容”的多边形图层?...