设计模式详解(四)抽象工厂模式
文章目录
- 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下不同的肤色,然后再创建一个工厂类。这是比较简单的;
但是如果再增加一个棕色人(族),则需要在抽象工厂中添加一个生产棕色人种方法,并且要修改之前已经实现抽象类的两个具体类,违反了开闭原则,问题的本质在于工厂内部用不同的方法区别于不同的族,增加族就要改变抽象工厂内部的方法
设计模式详解(四)抽象工厂模式相关推荐
- C++设计模式详解之抽象工厂模式解析
抽象工厂模式概念 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类 抽象工厂模式实例 以组装电脑为例,一般来说,电脑组装都不可能是一家公司的零件,简单的来说,显卡就有NVIDIA和A ...
- 设计模式详解:抽象工厂模式
今天我们来看一下另一个使用频率非常高的抽象工厂模式,看完原理分别给出.NET和JAVA两种语言的实现源码. 定义: 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类. ...
- 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)
1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...
- 【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝
目录 说明 实现方式 自问自答 其他链接 说明 五大创建型模式之一,其他还有单例模式.原型模式.建造者模式.工厂模式. 抽象工厂模式(Abstract Factory Pattern):定义了一个in ...
- 《设计模式详解》创建型模式 - 工厂模式
<设计模式详解> 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. ...
- 工厂模式详解(简单工厂模式,工厂方法模式,抽象工厂模式,只给出抽象工厂模式具体代码)
1.简单工厂模式(Factory) 应用场景:又叫做静态工厂方法(StaticFactory Method)模式,但不属于 23 种设计模式之一.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决 ...
- 《设计模式详解》行为型模式 - 状态模式
状态模式 6.5 状态模式 6.5.1 反例 6.5.2 结构 6.5.3 案例实现 6.5.4 优缺点 6.5.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 行为型 ...
- 《设计模式详解》行为型模式 - 模板方法模式
模板方法模式 6.1 模板方法模式 6.1.1 概述 6.1.2 结构 6.1.3 案例实现 6.1.3 优缺点 6.1.4 适用场景 6.1.5 JDK源码 - InputStream 完整的笔记目 ...
- 《设计模式详解》结构型模式 - 代理模式
代理模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 动态代理 JDK 动态代理 JDK 动态代理分析 CGLIB 动态代理 5.1.5 三种代理的对比 5 ...
- 《设计模式详解》创建型模式 - 建造者模式
建造者模式 4.4 建造者模式 4.4.1 概述 4.4.2 结构 4.4.3 实例 4.4.4 优缺点 4.4.5 使用场景 4.4.6 扩展 - 构建对象 重构前 重构后 4.5 创建型模式对比 ...
最新文章
- ffmpeg推送图片到流媒体服务器
- boost::mp11::mp_count_if_q相关用法的测试程序
- 为SQLMap配置WebUI界面
- sendData to ABAP backend via multiple form content type
- 自训练:超越预训练,展现强大互补特性的上分新范式!
- 为何程序C语言不会消亡?程序员学习C会白学吗?
- FreeTextBox 3.1.6 的实践总结和几个问题
- 面向对象方法及软件工程——团队答辩
- 运维堡垒机(跳板机)系统 python
- h5 前端 PHP,十分钟搞定微信H5支付(ThinkPHP5.1)
- 4400php兑换美金是多少,美金换算人民币怎么算(美金换人民币怎样计算)
- linux宕机故障分析案例,[文章]Linux宕机故障分析案例
- 【C++ Primer】第十章 泛型算法 (练习)
- 操作成功的提示信息动态添加
- 复数的概念及运算(复变函数)
- 笔记本电脑如何用c语言开无线网卡,笔记本电脑无线上网卡怎么用 笔记本电脑无线上网卡使用方法...
- fpga驱动rgb液晶屏_用FPGA设计LCD 转 VGA 其实vga和lcd驱动 非常类似
- (课程学习笔记)Excel学习
- ca加密是什么情况_让我们进行加密:为什么要创建一个免费,自动化和开放的CA?...
- LeetCode160.相交链表
热门文章
- SqlServer数据库定时备份
- java dateutils_Java中简单日期工具类DateUtils的实现
- OpenGL超级宝典(第7版)之第十一章高级数据管理
- CCNP-BSCI的实验环境dynamips(dynagen)版本
- git中出现”the requested upstream branch ‘origin/master‘ does not exist“问题的解决
- Eclipse中CVS界面功能描述(一)
- java生成32位流水号,Java生成流水号
- vue echarts使用map地图 引入china.js报错Cannot read property ‘echarts’ of undefined
- 最新广东省知识产权贯标奖励及补助政策汇总大全,包括广州、深圳等
- arcgis两张图层不能同时显示_如何在ArcGIS中合并两个“不兼容”的多边形图层?...