设计模式3之抽象工厂模式
抽象工厂模式定义
工厂方法模式中工厂只负责同类产品的生产。比如电视机工厂不应该生产汽车。
然而现实生活中有很多综合型的工厂,比如有些电视工厂不仅生产电视机,还会生产与之配套的机顶盒。
那么抽象工厂模式随之诞生,这种模式将考虑多种类型产品的生产。
我们总结下:
“
工厂方法模式只考虑成产同一等级级的产品
抽象方法模式考虑生产多等级的产品,可以说是工厂方法模式的升级版
”
如上图,小米音响和苹果音响为同一个产品。而小米手机和小米音响为同一产品族。
使用场景
那么什么情况下可以使用抽象工厂模式?
使用抽象工厂模式一般要满足以下条件。
系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
系统一次只可能消费其中某一族产品,即同族的产品一起使用。
抽象工厂模式同工厂方法模式结构一样,需要抽象产品,抽象工厂,具体产品,具体工厂4部分组成。
结构图如下:
实现代码
这个图你可能看着头晕,我们用代码来表示:
首先创建抽象工厂AbstractFactory
public interface AbstractFactory {Product1 newProduct1();Product2 newProduct2();
}
然后在创建两个抽象产品
/*** 手机*/
public interface Product1 {void show();
}/*** 音响*/
public interface Product2 {void show();
}
然后创建具体产品
public class ConcreteProduct11 implements Product1 {@Overridepublic void show() {System.out.println("具体产品11显示【小米-手机】...");}
}public class ConcreteProduct12 implements Product1 {@Overridepublic void show() {System.out.println("具体产品12显示【苹果-手机】...");}
}public class ConcreteProduct21 implements Product2 {@Overridepublic void show() {System.out.println("具体产品21显示【小米-音响】...");}
}public class ConcreteProduct22 implements Product2 {@Overridepublic void show() {System.out.println("具体产品22显示【苹果-音响】...");}
}
再创建具体工厂ConcreteFactory1
用来生产小米产品【小米-手机,小米-音响】
/*** Description: 小米工厂** @author Lvshen* @since JDK 1.8*/
public class ConcreteFactory1 implements AbstractFactory {public Product1 newProduct1() {System.out.println("具体工厂 1 【小米工厂】 生成-->具体产品 11...");return new ConcreteProduct11();}public Product2 newProduct2() {System.out.println("具体工厂 1 【小米工厂】 生成-->具体产品 21...");return new ConcreteProduct21();}
}
ConcreteFactory1
用来生产苹果产品【苹果-手机,苹果-音响】
/*** Description: 苹果工厂** @author Lvshen* @since JDK 1.8*/
public class ConcreteFactory2 implements AbstractFactory {public Product1 newProduct1(){System.out.println("具体工厂 2 【苹果工厂】生成-->具体产品 12...");return new ConcreteProduct12();}public Product2 newProduct2(){System.out.println("具体工厂 2 【苹果工厂】生成-->具体产品 22...");return new ConcreteProduct22();}
}
测试
我们使用小米工厂,生产小米手机
@Slf4j
public class FactoryTest {@Testpublic void test() {ConcreteFactory1 concreteFactory1 = new ConcreteFactory1();Product1 product1 = concreteFactory1.newProduct1();product1.show();}
}
测试结果
我们再来用苹果工厂生产苹果音响
@Slf4j
public class FactoryTest {@Testpublic void test() {ConcreteFactory2 concreteFactory = new ConcreteFactory2();Product2 product = concreteFactory.newProduct2();product.show();}
}
测试结果
关于抽象工厂模式的思考
当新增一条产品族时,只需要新增一个工厂即可。比如新增华为手机,华为音响,我们就需要需新增华为工厂。
如果新增新产品等级的产品,那么就需要修改工厂。假如我们新增了手环产品,比如小米手环,苹果手环,华为手环。那么,每个工厂都需要修改。这并不满足闭开原则。
我们再总结下什么情况下会使用抽象工厂模式:
“
系统中有多个产品族,但每次只使用其中的某一族产品。比如我就喜欢专门使用小米的手机和手环
系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构
”
同工厂模式一样,抽象工厂模式的优点在于,我们不需要知道产品是如何创建的。要获取产品对象,通过工厂就可以获取。做到了很好的封装。
如果产品族类的产品与产品之间存在约束,比如小米手环和小米手机有一定的约束【小米手环需要与小米手机配对才能激活小米手环(这里我瞎说,只是举个栗子
设计模式3之抽象工厂模式相关推荐
- 设计模式C#描述——抽象工厂模式
设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...
- 设计模式二、抽象工厂模式
设计模式part2 1. 抽象工厂模式 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题, ...
- JavaScript 23 种设计模式之 4 抽象工厂模式
JavaScript 23 种设计模式之 4 抽象工厂模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 提供一组相关或相互依赖对象的接口.抽象工厂模式是工厂方法模式的升级版, ...
- 设计模式普及之抽象工厂模式
本文是读<Android源码设计模式解析与实战>后笔记 抽象工厂的定义 为创建一组相关或者是相互依赖的对象提供一个借口,而不需要指定它们的具体类. 抽象工厂的使用场景 一个对象族有相同的约 ...
- 【设计模式】之抽象工厂模式
创造性设计模式 创造型模式主要是为了实例化类所用.进一步又分为类创建.对象创建模式. 类创建模式 类创建模式主要基于继承方式进行实例化 对象创建模式 对象创建模式主要基于委托机制进行实例化 Abstr ...
- java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式
抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...
- java设计模式六(抽象工厂模式)
java设计模式-抽象工厂模式 一.概述 抽象工厂模式是在工厂模式的基础上,加上了一个管理工厂的超级工厂.也就是说,工厂的作用是管理各种有相似功能的类,而超级工厂的作用是管理这些工厂. 二.模式示例: ...
- 【设计模式】之抽象工厂模式详解与应用(三)
开心一刻 [问:"怎么样才能给足男人面子"? 神回复:"露出腿上的淤青啊".] 课程介绍 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工 ...
- 设计模式之笔记--抽象工厂模式(Abstract Factory)
抽象工厂模式(Abstract Factory) 定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 类图 描述 多个抽象产品 ...
- 设计模式之【抽象工厂模式】
抽象工厂模式 (Abstract Factory Pattern) 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 主要解决:主要解决接口选择的问题. 何时使用:系统的产品 ...
最新文章
- 【转】【UML】使用Visual Studio 2010 Team System中的架构师工具(设计与建模)
- java克鲁斯卡尔算法_Java语言基于无向有权图实现克鲁斯卡尔算法代码示例
- md5加密解密代码_Python内置方法实现基于秘钥的信息加解密
- 分享Silverlight/WPF/Windows Phone一周学习导读(12月20日-12月26日)
- SVN移植、合库、分库
- 15个基本不定积分公式和分类基本积分表
- 微信支付?一起观摩Safesound勒索病毒的骚操作
- python语言简单界面选择苏康码图片文字识别
- 通过创建Google快讯将定期搜索结果发送到Gmail信箱
- 同方有云,加速领跑信创新时代
- 安装计算机一级出现appcrash,电脑appcrash的问题怎么修复
- EXCEL 2013中“定义名称”的命名规则
- python correlate_关于numpy互相关函数np.correlate的一点疑问
- 高新技术企业研发费用占比要求是多少
- 做计算机的小卫士教案,小学信息技术教案四年级上环保小卫士
- python3使用代理 报错MaxRetryError
- 解决qq安全防护更新进程总提示的方法
- 三款主流文件校验码工具HashCalc、WinMD5、Hasher
- Win11右下角时间怎么显示星期几?
- python常见的数据类型是_python基本数据类型都在这里
热门文章
- 无字母数字webshell总结
- 2021年N1叉车司机考试题库
- BookShop项目开发的一个小结
- 信息安全数学基础 第4章 二次同余式与平方剩余
- 【错误记录】Android Studio 编译报错 ( Execution failed for task ‘:APP_MIDI:lintVitalRelease‘. )
- 使用 vscode 安装配置 clang-format(代码格式化)
- 【安全利器SELinux快速入门系列 | 02】SELinux 策略实施的可视化操作指南
- 番茄钟怎么设置,教你用便签设置番茄钟
- Xcode13 The Legacy Build System will be removed in a future release.
- AX88772B 驱动移植