抽象工厂模式_设计模式3之抽象工厂模式
抽象工厂模式定义
工厂方法模式中工厂只负责同类产品的生产。比如电视机工厂不应该生产汽车。
然而现实生活中有很多综合型的工厂,比如有些电视工厂不仅生产电视机,还会生产与之配套的机顶盒。
那么抽象工厂模式随之诞生,这种模式将考虑多种类型产品的生产。
我们总结下:
“工厂方法模式只考虑成产同一等级级的产品抽象方法模式考虑生产多等级的产品,可以说是工厂方法模式的升级版”
![](/assets/blank.gif)
如上图,小米音响和苹果音响为同一个产品。而小米手机和小米音响为同一产品族。
使用场景
那么什么情况下可以使用抽象工厂模式?
使用抽象工厂模式一般要满足以下条件。
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
抽象工厂模式同工厂方法模式结构一样,需要抽象产品,抽象工厂,具体产品,具体工厂4部分组成。
结构图如下:
![](/assets/blank.gif)
实现代码
这个图你可能看着头晕,我们用代码来表示:
首先创建抽象工厂AbstractFactory
public interface AbstractFactory { Product1 newProduct1(); Product2 newProduct2();}
然后在创建两个抽象产品
/** * 手机 */public interface Product1 { void show();}/** * 音响 */public interface Product2 { void show();}
然后创建具体产品
public class ConcreteProduct11 implements Product1 { @Override public void show() { System.out.println("具体产品11显示【小米-手机】..."); }}public class ConcreteProduct12 implements Product1 { @Override public void show() { System.out.println("具体产品12显示【苹果-手机】..."); }}public class ConcreteProduct21 implements Product2 { @Override public void show() { System.out.println("具体产品21显示【小米-音响】..."); }}public class ConcreteProduct22 implements Product2 { @Override public 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(); }}
测试
我们使用小米工厂,生产小米手机
@Slf4jpublic class FactoryTest { @Test public void test() { ConcreteFactory1 concreteFactory1 = new ConcreteFactory1(); Product1 product1 = concreteFactory1.newProduct1(); product1.show(); }}
测试结果
![](/assets/blank.gif)
我们再来用苹果工厂生产苹果音响
@Slf4jpublic class FactoryTest { @Test public void test() { ConcreteFactory2 concreteFactory = new ConcreteFactory2(); Product2 product = concreteFactory.newProduct2(); product.show(); }}
测试结果
![](/assets/blank.gif)
关于抽象工厂模式的思考
当新增一条产品族时,只需要新增一个工厂即可。比如新增华为手机,华为音响,我们就需要需新增华为工厂。
如果新增新产品等级的产品,那么就需要修改工厂。假如我们新增了手环产品,比如小米手环,苹果手环,华为手环。那么,每个工厂都需要修改。这并不满足闭开原则。
我们再总结下什么情况下会使用抽象工厂模式:
“系统中有多个产品族,但每次只使用其中的某一族产品。比如我就喜欢专门使用小米的手机和手环系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构”
同工厂模式一样,抽象工厂模式的优点在于,我们不需要知道产品是如何创建的。要获取产品对象,通过工厂就可以获取。做到了很好的封装。
如果产品族类的产品与产品之间存在约束,比如小米手环和小米手机有一定的约束【小米手环需要与小米手机配对才能激活小米手环(这里我瞎说,只是举个栗子)】。那么可以在小米工厂内做出约束,用户并不需要知道内部如如何约束。
我们再来列举一个使用场景
“
如一个文本编辑器和一个图片处理器,都是软件实体,但是Linux下的文本编辑器和Windows下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也有类似情况。也就是具有了共同的约束条件:操作系统类型。于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。
”
抽象工厂模式_设计模式3之抽象工厂模式相关推荐
- 从java多态到策略模式_设计模式中的多态——策略模式详解
2. 策略模式详解 2.1 策略模式定义 策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户端而独立的变化. 可以使用多态进行类比来理解策略模 ...
- java mediator模式_设计模式之Mediator 中介者模式 - 解道Jdon
设计模式目录 >> 当前页 设计模式之Mediator(中介者) 板桥里人 http://www.jdon.com 2002/05/05 Mediator中介者模式定义: 用一个中介对象来 ...
- python策略模式_设计模式(python实现):策略模式
策略模式简单说和小时候我们玩的玩具差不多,一堆零部件通过不同的拼凑构成几个不同的机器人. 1.举个栗子 我们买了一个机器人,同时这个机器人配了三把武器,三把武器可以替换使用 2.Show in Cod ...
- 抽象工厂模式_设计模式系列—抽象工厂模式
前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...
- 抽象工厂模式_设计模式(3) 抽象工厂模式
抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式.简单工厂的职责非常简单:构造某个实体类型,然后把实例作为抽象类型返回: 工厂方法模式则进一步抽象出 ...
- 抽象工厂模式_设计模式——抽象工厂模式
阅读目录 使用频率:★★★★★ 一.什么是抽象工厂模式 二.补充说明 三.角色 四.例子 使用频率:★★★★★ 一.什么是抽象工厂模式 就是对一组具有相同主题的工厂进行封装(维基百科解释的很到位): ...
- mysql工厂模式_设计模式-三种工厂模式实例
1.简单工厂模式:代替new产生对象,产品的类型比较少时. 我们要获得三种不同的数据库对象,如Mysql,SQLserver,Oracle,它们拥有共同的特征,即可以进行抽象,简单工厂目的是将获得具体 ...
- 创建型模式、结构型模式和行为型模式_设计模式之创建型模式
设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...
- 米线店结账程序 装饰着模式_设计模式——装饰者模式
<Head First 设计模式> 学习笔记,码云同步更新中 如有错误或不足之处,请一定指出,谢谢~ 目录 查看其它设计模式笔记,点这里→设计模式笔记汇总 装饰者模式 定义: 动态地将责任 ...
- 米线店结账程序 装饰着模式_设计模式(三)装饰者模式
装饰者模式是以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.装饰者模式动态地将责任附加到对象身上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案,比生成子类更加灵活. 通常在继承关系 ...
最新文章
- linux内核杂记(3)-进程(1)
- 美国总统就职演说词汇分布图
- LeetCode 1474. 删除链表 M 个节点之后的 N 个节点
- ppt2003 未找到 mathpagewll 53_steam每日特惠:《伊拉图斯:死之主》今日史低53元
- PHP中文分词的实现
- python剑指offer剪绳子
- 经典排序算法(六)--归并排序Merge Sort
- 四种方法求Capacitated Facility Location Problem问题
- 关于JavaScript中的事件代理(例子:ul中无数的li上添加点击事件)
- Hibernate(1)
- 谁蹭了我的WiFi?浅谈家用无线路由器攻防
- 信号与系统学习总结 第三章 傅里叶变换
- 5月25日------疯狂猜成语-----四周第七次站立会议 参会人员:杨霏,袁雪,胡潇丹,郭林林,尹亚男,赵静娜...
- 记录在处理SIF数据中,遇到的一些问题及解决过程
- 水下航行器简介及水下面临的挑战
- html div中css设置平均水平分布,CSS - 水平和垂直分布div
- 个人电子邮箱怎么填写?电子邮箱格式怎么写?
- Mac上的Redis客户端 G-dis
- Pytest(17)运行未提交的git(pytest-picked)
- Vivado中Testbench模板(自用)
热门文章
- 12.微服务设计 --- 总结
- 4.深入分布式缓存:从原理到实践 --- Ehcache 与 Guava Cache
- 17.Linux/Unix 系统编程手册(上) -- 访问控制列表
- 41. 使用内容发布网络(2)
- 46. magento cron
- 18. jQuery - 尺寸
- arm poky linux,opencv移植在4412和imx6(yocto 3.14.28 arm-poky-linux-gnueabi )上
- jQuery打印插件JQPRINT
- 【转】浅谈命令查询职责分离(CQRS)模式
- spring mybatis mysql 事务不起作用