一、概述

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

  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. 【zz】史上最全设计模式导学目录(完整版)

    2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多篇与设计模式学习相关的文章,涵盖了七个面向对象设计原则和24个设计模式(23个GoF设计模式 +  简单工厂模式),为了方便大家 ...

  2. 科普文:从人人网看网络科学(Network Science)的X个经典问题

    转:https://zr9558.wordpress.com/2013/12/05/科普文:从人人网看网络科学(network-science)的x个经典问/ 长文,写了N个小时写完的.你肯定能看懂, ...

  3. 条件独立(conditional independence) 结合贝叶斯网络(Bayesian network) 概率有向图 (PRML8.2总结)

    转:http://www.cnblogs.com/Dzhouqi/p/3204481.html本文会利用到上篇,博客的分解定理,需要的可以查找上篇博客 D-separation对任何用有向图表示的概率 ...

  4. mongodb 备份、还原、导入、导出

    mongodump备份数据库 常用的备份命令格式 mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 如果想导出所有数据库,可以去掉-d - ...

  5. 第一章 介绍Django

    Django是一个网络开发框架,有了这个框架,能是网站开发更高效有趣,能轻松的创建和维护高质量的网站应用. 这一本书的目的是使读者成为一个Django的专家.主要着重两点.第一,深入的解释Django ...

  6. 检测Android和IOS

    var u=navigator.userAgent; var isAndroid=u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; / ...

  7. 计算机网络概述4_性能指标之时延,时延带宽积,往返时间RTT,利用率

    发送时延(传输时延):从发送分组的第一个比特算起,到该分组的最后一个比特发送完毕所需的时间. 总结:

  8. 树莓派图形界面启动chromium并全屏

    方法1. 随便一搜都是这种方法 创建文件:  /home/pi/.config/autostart/my.desktop    文件名随意, 后缀必须.desktop 文件内容: ​[Desktop ...

  9. C#处理List<object>重复数据的问题

    private class ListDistinct : IEqualityComparer<object> { public bool Equals(object x, object y ...

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

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