文章目录

  • 什么是抽象工厂模式
  • 例子
  • 总结
  • 简单工厂、工厂方法、抽象工厂区别

什么是抽象工厂模式

不关心零件的具体实现,只关心接口,仅使用该接口将零件组装成为产品。

例子

不同厂商生产多个产品

AbstractFactory 生产冰箱空调电视机

package CreationPattern.AbstractFactoryMode;/*** 抽象工厂*/public interface AbstractFactory {Refrigerator createRefrigerator ();AirConditioning createAirConditioning ();TV createTV();
}

Refrigerator

package CreationPattern.AbstractFactoryMode;/*** 冰箱*/public class Refrigerator {public Refrigerator(String s) {System.out.println("create " + s + " refrigerator");}
}

AirConditioning

package CreationPattern.AbstractFactoryMode;/*** 空调*/public class AirConditioning {public AirConditioning(String s) {System.out.println("create " + s + " airConditioning");}
}

TV

package CreationPattern.AbstractFactoryMode;/*** 电视机*/public class TV {public TV(String s) {System.out.println("create " + s + " tv");}
}

HaierFactory

package CreationPattern.AbstractFactoryMode;/*** 海尔品牌工厂*/public class HaierFactory implements AbstractFactory{String brand = "Haier";@Overridepublic Refrigerator createRefrigerator() {return new Refrigerator(brand);}@Overridepublic AirConditioning createAirConditioning() {return new AirConditioning(brand);}@Overridepublic TV createTV() {return new TV(brand);}
}

GeliFactory

package CreationPattern.AbstractFactoryMode;/*** 格力品牌工厂*/public class GeliFactory implements AbstractFactory{private String brand = "Geli";@Overridepublic Refrigerator createRefrigerator() {return new Refrigerator(brand);}@Overridepublic AirConditioning createAirConditioning() {return new AirConditioning(brand);}@Overridepublic TV createTV() {return new TV(brand);}
}

Main

package CreationPattern.AbstractFactoryMode;/*** Main*/public class Main {public static void main(String[] args) {AbstractFactory haierFactory = new HaierFactory();haierFactory.createRefrigerator();haierFactory.createAirConditioning();haierFactory.createTV();AbstractFactory geliFactory = new GeliFactory();geliFactory.createRefrigerator();geliFactory.createAirConditioning();geliFactory.createTV();}
}

结果

总结

抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;

抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。

抽象工厂易于增加具体的工厂,而难以增加新的零件。从上述例子也不难看出,在AbstractFactory类中增加一个产品例如洗衣机,所有的具体工厂都需要增加洗衣机,而增加一个具体的工厂例如海信工厂只需实现AbstractFactory类。

简单工厂、工厂方法、抽象工厂区别

简单工厂:单个产品对应单个厂商,1对1。例如空调工厂只生产格力空调
工厂方法:单个产品对应多个厂商,1对多。例如空调工厂生成格力空调,还生产海尔空调
抽象工厂:多个产品对应多个厂商,多对多。例如工厂不仅生产不同品牌的空调,还生产不同品牌的冰箱。
总之,我的理解是抽象工厂和工厂方法的主要区别在于生产能力的不同。

设计模式(八)之抽象工厂模式相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 【设计模式】之抽象工厂模式详解与应用(三)

    开心一刻 [问:"怎么样才能给足男人面子"? 神回复:"露出腿上的淤青啊".] 课程介绍 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工 ...

  9. 设计模式之笔记--抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory) 定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 类图 描述 多个抽象产品 ...

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

    抽象工厂模式 (Abstract Factory Pattern) 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 主要解决:主要解决接口选择的问题. 何时使用:系统的产品 ...

最新文章

  1. 基于MATLAB的RGB转YCBCR色彩空间转换
  2. java opengl_java基于OpenGL ES实现渲染实例
  3. mysql like ilike_MySQLilike 子句
  4. 笔记-中项案例题-2021年上-范围管理
  5. Mac全量编译ijkplayer生成Android库
  6. 卡西欧9860连接电脑数据传输_轻松办公好助手,卡西欧STYLISH计算器体验记
  7. 【渝粤教育】电大中专品牌管理与推广 (2)作业 题库
  8. 马化腾回应《腾讯没有梦想》:我的理想不是赚多少钱
  9. Visual Studio 2012 RC 发布
  10. regexp用法mysql_MySQL中REGEXP正则表达式使用大全
  11. 使用Kali Linux Metasploit 复现 word宏
  12. Linux 磁盘清理
  13. 【破解软件】知音漫客免费看更多漫画
  14. 电脑重装系统Win10关闭网速限制的方法
  15. csgo单板透视距离绘制代码
  16. 数据是一把双刃剑,IPFS/FIL存储助力发展,合理应用技术中
  17. Reservior Sampling(蓄水池采样) in Data Streams
  18. 菜学C++ Day55 OJ题目1151桐桐数
  19. Python,海龟作图,闪避球小游戏
  20. 不要用for in 不要用for in 不要用for in 尤其在JavaScript 遍历document时

热门文章

  1. angular2表单初体验
  2. 那些年我发现的圈子(2)爱奇艺泡泡
  3. 一文详解DCMM(数据管理能力成熟度评估模型)贯标评估全流程
  4. 【koa2】介绍路由
  5. java标识符可以$开头吗_JAVA标识符
  6. ipython介绍_IPython的介绍与使用
  7. 电商运营:2020天猫618超级晚营销怎么玩?最新营销方案献上
  8. “Unable to install breakpoint due to missing line number attributes,Modify compiler options togenera
  9. 微前端框架 之 single-spa
  10. 速度之王 — LZ4压缩算法(一)