抽象工厂模式

为什么引入抽象工厂模式?

一个接口代表一系列操作,当我们需要的对象需要多个接口,而这些接口又是不相干的,同时对于类的创建我们不需要知道具体的实现细节,只需要知道某个特征就可以,虽然工厂方法模式可以满足要求,但是工厂方法模式会让类本身实现很多不相关的操作,同时增加了对象内部的复杂性,我们需要一种从更高层来抽象,将接口分离,同时在创建对象的时候,又将不同接口之前操作进行组合的角色,这个就是抽象工厂模式。

抽象工厂模式是什么?

提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。

核心思想:

在工厂模式的基础上,进行更高一层的抽象,将不同的接口进行组合,通过工厂,从而生成具有多个操作的具体实例,抽象工厂模式从顶层出发,我们先考虑生产生什么,然后再将对象的操作进行拆分,将相同的操作交给特定的厂商。

具体实例

我们现在需要定制一批电脑,委托A和B公司为我们生产,但是A和B公司会将不同的部件生产交给不同的工厂进行加工,到时候在运输过来进行组装。

UML:

具体代码:


package com.dong.AbstractFactory;
//工厂接口,可以理解总工厂
public interface Facotory{public Mouse createMouse();public KeyBoard createKeyBoard();
}package com.dong.AbstractFactory;
//A工厂
public class AFactory implements Facotory {@Overridepublic Mouse createMouse() {System.out.println("A Mouse");return new Amouse();}@Overridepublic KeyBoard createKeyBoard() {System.out.println("A keyBoary");return new AkeyBoard();}
}package com.dong.AbstractFactory;
//B工厂
public class BFactory implements Facotory {@Overridepublic Mouse createMouse() {System.out.println("B mouse ");return new Bmouse();}@Overridepublic KeyBoard createKeyBoard() {System.out.println("B keyBoard");return new BKeyBoard();}
}package com.dong.AbstractFactory;
//鼠标接口,即包含键盘的一些属性和功能
public interface Mouse {public void brand();
}package com.dong.AbstractFactory;
//键盘接口,即包含键盘的一些属性和功能
public interface KeyBoard {public void type();
}package com.dong.AbstractFactory;
//A键盘生产商
public class AkeyBoard implements KeyBoard{@Overridepublic void type() {System.out.println("A keyboard");}
}package com.dong.AbstractFactory;
//A鼠标生产商
public class Amouse implements Mouse{@Overridepublic void brand() {System.out.println("A mouse ");}
}package com.dong.AbstractFactory;
//B鼠标生产商
public class Bmouse implements Mouse{@Overridepublic void brand() {System.out.println("Bmouse");}
}package com.dong.AbstractFactory;
//B键盘生产商
public class BKeyBoard implements KeyBoard {@Overridepublic void type() {System.out.println("BKeyboard");}
}package com.dong.AbstractFactory;
/*** 结果分析:*  A MouseA keyBoarycom.dong.AbstractFactory.Amouse@136432db* @author liuD**/
public class FactoryMain {public static void main(String[] args) {AFactory af = new AFactory();Mouse amouse =af.createMouse();KeyBoard akeyboard = af.createKeyBoard();System.out.println(amouse.toString() + akeyboard.toString());}
}

优点

实现了良好的框架结构,分离不相关的接口,

顶层设计不需关注具体实现,即具有良好的封装性,将具体生产交给具体的实现厂商,实现厂商又可以看做是一个使用工厂模式的例子,用来创建对象,只不过抽象工厂方法,将对象的同种操作,使用接口进行了统一和分离,使用的时候,只需进行组合即可。

缺点

不利于扩展,当我们要增加一个厂商时,我们需要改动实现接口的厂商,其次需要给每个接口增加实现类,当我们想要增加一个新的不同的对象时,这个对象和原来的厂商没有任何相同之处,当我们将其添加到抽象工厂类中时,所有的类,接口,都必须变动。

新的感悟:

例如,当我们想要生产鞋子,鞋子的种类很多,我们使用工厂模式进行生产,我们可以提供几个简单的提示,就可以利用工厂生产出我们需要的鞋子,例如我们需要运动鞋,我们告诉工厂运动,,需要帆布鞋,告诉工厂帆布就可以,这里只不过是一种生产对象的方式而已,别的方式也可以,重点在于,工厂模式的生产是基于一种单一的特性,我们只需要生产鞋子(假定鞋子的生产具有单一性)。

抽象工厂模式,在举个例子,当我们需要生产衣服,当这个对象可以进行拆分,当使用工厂模式,则会生产出A工厂的整套衣服,当然可以进行分开设计,让工厂生产出什么样的上衣,什么样的下衣,但是全都是由A工厂生产,如果A公司的是生产的上衣质量好,但是下衣质量不好,这个时候我们可以使用抽象工厂模式,即将上衣和下衣的生产承包给不同的公司,然后再在上层使用工厂模式进行组合即可。

抽象工厂模式,我的理解是,最大的好处是实现了工厂的定制,生产的选择和组合性。

设计模式笔记之三抽象工厂模式相关推荐

  1. 【设计模式笔记】抽象工厂模式

    围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂. 提供了一种创建对象的最佳方式. 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显示指定它们的类. 每个生成的工厂都能按照工厂 ...

  2. 设计模式C#描述——抽象工厂模式

    设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...

  3. 设计模式二、抽象工厂模式

    设计模式part2 1.     抽象工厂模式 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题, ...

  4. JavaScript 23 种设计模式之 4 抽象工厂模式

    JavaScript 23 种设计模式之 4 抽象工厂模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 提供一组相关或相互依赖对象的接口.抽象工厂模式是工厂方法模式的升级版, ...

  5. 《JavaScript设计模式》笔记 之 抽象工厂模式

    抽象工厂模式 抽象工厂模式:通过对类的工厂抽象使其业务用域对产品类簇的创建,而不是负责创建某一类产品的实例. 抽象类 JavaScript 中 abstract 还是保留字,虽然不像传统面向对象创建, ...

  6. 设计模式普及之抽象工厂模式

    本文是读<Android源码设计模式解析与实战>后笔记 抽象工厂的定义 为创建一组相关或者是相互依赖的对象提供一个借口,而不需要指定它们的具体类. 抽象工厂的使用场景 一个对象族有相同的约 ...

  7. 【设计模式】之抽象工厂模式

    创造性设计模式 创造型模式主要是为了实例化类所用.进一步又分为类创建.对象创建模式. 类创建模式 类创建模式主要基于继承方式进行实例化 对象创建模式 对象创建模式主要基于委托机制进行实例化 Abstr ...

  8. java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式

    抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...

  9. java设计模式六(抽象工厂模式)

    java设计模式-抽象工厂模式 一.概述 抽象工厂模式是在工厂模式的基础上,加上了一个管理工厂的超级工厂.也就是说,工厂的作用是管理各种有相似功能的类,而超级工厂的作用是管理这些工厂. 二.模式示例: ...

最新文章

  1. 密切值matlab程序,密切值法
  2. Android 源码查看和解析
  3. C++学习笔记-----函数调用时的决议:名字查找,重载决议,可访问性检测
  4. java调用支付宝接口代码介绍
  5. 通过IP获取相应所在地的地址
  6. 【数据预测】基于matlab双向长短时记忆(biLSTM)数据预测【含Matlab源码 1793期】
  7. 开源demo| 视频应用类开源 Demo 大盘点
  8. 股指期货开户的条件和流程
  9. 概率论的V=max{X,Y},U=min{X,Y},W=X+Y的求解分布律解法——笔记
  10. Golang 1.16 新特性-embed 包及其使用
  11. English improvement of IT Test(2016)
  12. linux生成表格的后缀,使用XSSFWork创建的xlsx后缀Excel文件无法打开
  13. 天道酬勤系列之Python 希尔排序
  14. 自媒体人想要写好实时热点文章,一定要掌握好这三点
  15. CodeVIO:基于可学习优化密集深度的视觉惯性里程计(ICRA2021)
  16. Python CF入门实验
  17. scanf函数中输入格式及输入基本原理讲解
  18. 安装 m2e 插件(maven for eclipse) 插件的最新网址
  19. MXNET深度学习框架-09-使用正则化方法解决过拟合问题(以从0开始的线性回归为例)
  20. 掌财社寒山:白马股和黑马股有什么区别?

热门文章

  1. 开会迟到,代码不规范,新人程序员被疯狂吐槽
  2. 向陈越姥姥哭诉----关键活动
  3. 正确理解javascript中的Event loop机制
  4. Oracle中常用表和视图
  5. NAND flash 相关知识
  6. 一篇文章带你精通Redis 缓存数据库
  7. 计算机大一课程设计游戏,01北科大暑期计算机实践FunCode游戏设计+C++课程设计_海底世界...
  8. 缓存穿透,缓存击穿,缓存雪崩详解
  9. iMeta期刊纸质版免费订阅(包邮)—第1期创刊收藏版(3月底截止)
  10. 【非编系统】非编系统是从事影视后期编辑的系统工具