一、概述

  抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。  

  UML图:

  

  其他的过多概念不再这里赘述,不如通过例子来实际感受与体会

二、实践

  关键是搞清等级族的概念,这里以生产手机为例,假设生产小米5和小米6两个型号的手机,两个手机都有内存和处理器,但是内存和处理器的组合不同

:米5采用的是骁龙820+16G内存组合,而米6则是骁龙835+32G组合。生产对应产品的时候就会匹配对应的产品部件组合,不会出现米5的骁龙835+16G等

的配置。

  看问题的角度也要发生变化,比如耐克有男鞋女鞋,乔丹有男鞋女鞋,可以按照品牌分为耐克、乔丹;也可以按照性别分为男鞋、女鞋。

  抽象工厂(生产内存和处理器,由纵向改为了横向)

/**
* 抽象工厂
* 作者: Administrator
* 日期: 2017/10/26
**/
public interface AbstractFactory {
Memory createMemory();
Processor createProcessor();
}

  抽象产品1(内存)

/**
* 内存接口
* 作者: Administrator
* 日期: 2017/10/26
**/
public interface Memory {
}

  具体产品1。1(16G内存)

/**
* 16G内存
* 作者: Administrator
* 日期: 2017/10/26
**/
public class Memory16 implements Memory{
public Memory16() {
System.out.println("16GB内存");
}
}

  具体产品1.2(32G内存)

/**
* 32G内存
* 作者: Administrator
* 日期: 2017/10/26
**/
public class Memory32 implements Memory{
public Memory32() {
System.out.println("32GB内存");
}
}

  抽象产品2(处理器)

/**
* 处理器接口
* 作者: Administrator
* 日期: 2017/10/26
**/
public interface Processor {
}

  具体产品2.1(820处理器)

/**
* 骁龙820
* 作者: Administrator
* 日期: 2017/10/26
**/
public class Processor820 implements Processor{
public Processor820() {
System.out.println("骁龙820");
}
}

  具体产品2.2(835处理器)

/**
* 骁龙835
* 作者: Administrator
* 日期: 2017/10/26
**/
public class Processor835 implements Processor{
public Processor835() {
System.out.println("骁龙835");
}
}

  具体工厂类1(生产米5,自动匹配配置)

/**
* 小米5的工厂
* 作者: Administrator
* 日期: 2017/10/26
**/
public class Mi5Factory implements AbstractFactory{
@Override
public Memory createMemory() {
return new Memory16();
} @Override
public Processor createProcessor() {
return new Processor820();
}
}

  具体工厂类2(生产米6,自动匹配配置)

/**
* 米6的工厂
* 作者: Administrator
* 日期: 2017/10/26
**/
public class Mi6Factory implements AbstractFactory{
@Override
public Memory createMemory() {
return new Memory32();
} @Override
public Processor createProcessor() {
return new Processor835();
}
}

  客户端的使用:

/**
* 客户端
* 作者: Administrator
* 日期: 2017/10/26
**/
public class Client {
public static void main(String[] args) {
Mi5Factory mi5Factory = new Mi5Factory();
mi5Factory.createMemory();
mi5Factory.createProcessor(); Mi6Factory mi6Factory = new Mi6Factory();
mi6Factory.createMemory();
mi6Factory.createProcessor();
}
}

三、改进与思考

  对开闭原则的支持

  以上述例子为例,需要增加新的配置组合,比如增加骁龙835+16G的组合(增加产品族),则符合开闭原则,只是拓展,无需修改

而如果需要增加一个新的产品等级结构(比如增加双摄),则所有工厂都需要改变;故抽象工厂模式部分支持开闭原则!

  如知乎网友所说:

  

四、工厂模式小结

  学习设计模式,很重要的一点是为什么要用这个设计模式,哪些地方要用这个设计模式。我们先来看来自百度知道的网友的提问:

  

  我们看最佳答案怎么说的:

  

  这里面的重点单词是:解耦!

  还有一个很重要的一点是前面的六大原则的基本原则——“开闭原则”,尽量不要改老代码,而是添代码!

  综上:

    工厂模式可以隐藏创建的细节,隐藏了具体类名后续如果想换掉不会影响调用者

    归一化的修改

    调用者不关心创建细节,只针对接口编程(依赖抽象而非依赖具体)

Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)的更多相关文章

  1. Java设计模式之创建型模式

    创建型模式分为五类:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 一.工厂方法模式:接口-实现类.工厂类

  2. java设计模式 -------- 创建模式 之 抽象工厂模式

    本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...

  3. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  4. [19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)

    一.工厂模式(分为:简单工厂模式.工厂方法模式.抽象工厂模式) 实现了创建者和调用者的分离 核心本质:1.实例化对象,用工厂方法代替new操作:2.将选择实现类.创建对象统一管理和控制,从而将调用者跟 ...

  5. Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  6. 设计模式的征途—3.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

  7. 设计模式的征途—4.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

  8. JAVA中的工厂方法模式和抽象工厂模式

    工厂方法模式: 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类.类型:创建类模式类图: 类图知识点:1.类图分为三部分,依次是类名.属性.方法2.以& ...

  9. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

随机推荐

  1. csr867x开发日记——常用软件工具介绍

    xIDE xIDE开发环境(编译器)可以被用于以下操作 查看代码 构建新应用 调试 运行 重新配置 修改 Universal Front End 通用前端 通用前端(UFE)工具用于配置DSP,ADK ...

  2. awk的简单使用

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  3. angular中ngOnChanges与组件变化检测的关系

    1.ngOnChanges只有在输入值改变的时候才会触发,如果输入值(@Input)是一个对象,改变对象内的属性的话是不会触发ngOnChanges的. 2.组件的变化检测: 2a.changeDet ...

  4. js 对象数组删除和查找的方法

    deleteItem: function (array,item) { const index = this.array.findIndex(text => text.name === item ...

  5. 高老大 ‘SQL Server 优化器特性导致的内存授予相关BUG’ 学习笔记

    今天高老大出了好文章.在这里 自己本来对这一块比较混乱,正好借这个机会学习一下. 就用高老大的脚本.需要的直接去他那里找吧,这里就省了. 加查询优化标记前后对比 可以看到GrantedMemory是5 ...

  6. 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)

    洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...

  7. ng2-bootstrap的modal嵌套时无法滚动的情况

    在ng2-bootstrap的弹窗modal中再弹出另外一个弹窗,关闭子弹窗后,父弹窗会出现无法上下滚动的情况. 通过观察样式可知,关闭子弹窗前,父弹窗的body上是有modal-open样式的,关闭 ...

  8. JQuery手写一个简单的轮播图

    做出来的样式: 没有切图,就随便找了一些图片来实现效果,那几个小星星萌不萌. 这个轮播图最主要的部分是animate(),可以先熟悉下这个方法. 代码我放到了github上,链接:https://gi ...

  9. Vue填坑(1)----通过vue-cli,认识vue-router

    开始 首先,确保之前已经安装过 npm 和 nodejs(为了避免版本的问题,最好使用较新的版本). 全局安装 vue-cli : npm install -g vue-cli 新建文件夹 my-pr ...

  10. 『C++』Temp_2018_12_06

    #include <iostream> #include <string> using namespace std; class Type{ public: string Na ...