博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)
阅读量:5072 次
发布时间:2019-06-12

本文共 2859 字,大约阅读时间需要 9 分钟。

一、概述

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

  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的组合(增加产品族),则符合开闭原则,只是拓展,无需修改

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

  如知乎网友所说:

  

 

四、工厂模式小结

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

  

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

  

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

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

  综上:

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

    归一化的修改

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

转载于:https://www.cnblogs.com/jiangbei/p/7541820.html

你可能感兴趣的文章
测试计划
查看>>
选择器
查看>>
Mysql与Oracle 的对比
查看>>
jquery实现限制textarea输入字数
查看>>
thinkphp5 csv格式导入导出(多数据处理)
查看>>
PHP上传RAR压缩包并解压目录
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>
多服务器操作利器 - Polysh
查看>>
jQuery 自定义函数
查看>>
jquery datagrid 后台获取datatable处理成正确的json字符串
查看>>
ActiveMQ与spring整合
查看>>
web服务器
查看>>
网卡流量检测.py
查看>>
ajax
查看>>
poj1981 Circle and Points 单位圆覆盖问题
查看>>
POP的Stroke动画
查看>>