一、概述

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

  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. 浅谈js冒泡事件2

    js冒泡阻止 1. 事件目标 现在,事件处理程序中的变量event保存着事件对象.而event.target属性保存着发生事件的目标元素.这个属性是DOM API中规定的,但是没有被所有浏览器实现 . ...

  2. slf4j-log4j12-1.5.8.jar有什么用

    slf4j是hibernate的日志接口,通常我们用log4j.jar来实现hibernate的记录日志功能,slf4j-log4j.jar可以看成是用来把slf4j的接口转换成适合log4j的接口的 ...

  3. websphere 配置库中已存在应用程序,异常处理

    from:http://mengdboy.iteye.com/blog/1677379 出现此问题的原因之一:操作界面上没有卸载完成. 进行一下操作: 1.删除 $WAS_HOME/profiles/ ...

  4. Java 中 Vector 和 ArrayList 的区别

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...

  5. 安装MySql-Python遇到的错误及解决方法

    用pip安装mysql-python时报错: _mysql.c _mysql.c(42) : fatal error C1083: Cannot open include file: 'config- ...

  6. mongo删除、添加分片

    MongoDB 分片的原理.搭建.应用   一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处 ...

  7. RabbitMQ之五种消息模型

    首先什么是MQ MQ全称是Message Queue,即消息对列!消息队列是典型的:生产者.消费者模型.生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息.因为消息的生产和消费都是异步的,而 ...

  8. mime中间件

    mime中间件Demo,里面用到的有 1.path模块 //引入模块 var path=require('path'); 2.extname方法 //获取文件的扩展名 var extname=path ...

  9. HDU 1006 Tick and Tick(时钟,分钟,秒钟角度问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1006 Tick and Tick Time Limit: 2000/1000 MS (Java/Oth ...

  10. Jstorm TimeCacheMap源代码分析

    /*** Eclipse Class Decompiler plugin, copyright (c) 2016 Chen Chao (cnfree2000@hotmail.com) ***/ pac ...