本文继续介绍23种设计模式系列之抽象工厂模式。
前面已经介绍过简单工厂模式和工厂方法模式,这里继续介绍第三种工厂模式-抽象工厂模式,还是以汽车的制造为例。
例子背景:
随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件。于是这个工厂开始生产空调和发动机,用来组装汽车。这时候工厂有两个系列的产品:空调和发动机。宝马320系列配置A型号空调和A型号发动机,宝马230系列配置B型号空调和B型号发动机。

概念:
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。比如宝马320系列使用空调型号A和发动机型号A,而宝马230系列使用空调型号B和发动机型号B,那么使用抽象工厂模式,在为320系列生产相关配件时,就无需制定配件的型号,它会自动根据车型生产对应的配件型号A。
针对百度百科上对于抽象工厂模式的简介,结合本例如下:
当每个抽象产品都有多于一个的具体子类的时候(空调有型号A和B两种,发动机也有型号A和B两种),工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品(产品空调有两个具体产品空调A和空调B)。抽象工厂模式提供两个具体工厂角色(宝马320系列工厂和宝马230系列工厂),分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

抽象工厂模式代码

产品类:

[java] view plaincopy print?
  1. //发动机以及型号
  2. public interface Engine {
  3. }
  4. public class EngineA extends Engine{
  5. public EngineA(){
  6. System.out.println("制造-->EngineA");
  7. }
  8. }
  9. public class EngineBextends Engine{
  10. public EngineB(){
  11. System.out.println("制造-->EngineB");
  12. }
  13. }
  14. //空调以及型号
  15. public interface Aircondition {
  16. }
  17. public class AirconditionA extends Aircondition{
  18. public AirconditionA(){
  19. System.out.println("制造-->AirconditionA");
  20. }
  21. }
  22. public class AirconditionB extends Aircondition{
  23. public AirconditionB(){
  24. System.out.println("制造-->AirconditionB");
  25. }
  26. }

创建工厂类:

[java] view plaincopy print?
  1. //创建工厂的接口
  2. public interface AbstractFactory {
  3. //制造发动机
  4. public Engine createEngine();
  5. //制造空调
  6. public Aircondition createAircondition();
  7. }
  8. //为宝马320系列生产配件
  9. public class FactoryBMW320 implements AbstractFactory{
  10. @Override
  11. public Engine createEngine() {
  12. return new EngineA();
  13. }
  14. @Override
  15. public Aircondition createAircondition() {
  16. return new AirconditionA();
  17. }
  18. }
  19. //宝马523系列
  20. public class FactoryBMW523 implements AbstractFactory {
  21. @Override
  22. public Engine createEngine() {
  23. return new EngineB();
  24. }
  25. @Override
  26. public Aircondition createAircondition() {
  27. return new AirconditionB();
  28. }
  29. }

客户:

[java] view plaincopy print?
  1. public class Customer {
  2. public static void main(String[] args){
  3. //生产宝马320系列配件
  4. FactoryBMW320 factoryBMW320 = new FactoryBMW320();
  5. factoryBMW320.createEngine();
  6. factoryBMW320.createAircondition();
  7. //生产宝马523系列配件
  8. FactoryBMW523 factoryBMW523 = new FactoryBMW523();
  9. factoryBMW320.createEngine();
  10. factoryBMW320.createAircondition();
  11. }
  12. }

关于抽象工厂模式与工厂方法模式的区别,这里就不说了,感觉多看几遍例子就能理解,还有很多提到的产品族、等级结构等概念,说了反而更难理解。

抽象工厂模式的起源
下面引用一段抽象工厂模式的起源:
抽象工厂模式的起源或者最早的应用,是用于创建分属于不同操作系统的视窗构建。比如:命令按键(Button)与文字框(Text)都是视窗构建,在UNIX操作系统的视窗环境和Windows操作系统的视窗环境中,这两个构建有不同的本地实现,它们的细节有所不同。
在每一个操作系统中,都有一个视窗构建组成的构建家族。在这里就是Button和Text组成的产品族。而每一个视窗构件都构成自己的等级结构,由一个抽象角色给出抽象的功能描述,而由具体子类给出不同操作系统下的具体实现。
可以发现在上面的产品类图中,有两个产品的等级结构,分别是Button等级结构和Text等级结构。同时有两个产品族,也就是UNIX产品族和Windows产品族。UNIX产品族由UNIX Button和UNIX Text产品构成;而Windows产品族由Windows Button和Windows Text产品构成。
系统对产品对象的创建需求由一个工程的等级结构满足,其中有两个具体工程角色,即UnixFactory和WindowsFactory。UnixFactory对象负责创建Unix产品族中的产品,而WindowsFactory对象负责创建Windows产品族中的产品。这就是抽象工厂模式的应用,抽象工厂模式的解决方案如下图:
显然,一个系统只能够在某一个操作系统的视窗环境下运行,而不能同时在不同的操作系统上运行。所以,系统实际上只能消费属于同一个产品族的产品。
在现代的应用中,抽象工厂模式的使用范围已经大大扩大了,不再要求系统只能消费某一个产品族了。

总结:
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

作者:jason0539

博客:http://blog.csdn.net/jason0539(转载请说明出处)

扫码关注我微信公众号

转载于:https://www.cnblogs.com/telwanggs/p/6781387.html

JAVA设计模式之抽象工厂模式相关推荐

  1. Java设计模式之 抽象工厂模式实验报告书

    目录 Java设计模式之 1 抽象工厂模式实验报告书 1 实验四:抽象工厂模式 2 一.实验目的 2 二.实验内容 2 三.实验步骤 2 3.1抽象工厂模式:电器工厂 2 3.2 car 6 3.3 ...

  2. Java 设计模式之抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  3. Java设计模式:抽象工厂模式

    1. 定义 抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例. 抽象工厂模式与工厂 ...

  4. 最简单java设计模式:抽象工厂模式

    前言 在前一篇文章讲解了一下简单工厂模式和工厂方法模式,这篇文章再把抽象工厂模式讲解一下. 一.什么是抽象工厂模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提 ...

  5. JAVA设计模式之抽象工厂模式和代理模式

    目录 一.抽象工厂模式 1.1.模式的定义与特点 1.2.模式的结构 二.代理模式 2.1代理模式的定义与特点 2.2代理模式的结构与实现 一.抽象工厂模式 1.1.模式的定义与特点 抽象工厂(Abs ...

  6. JAVA设计模式之——抽象工厂模式

    文章目录 一.类型 二.定义 三.参与者 四.类图 五.示例 六.适用情况 参考文章 一.类型 创建型模式 二.定义 定义一个接口,用于创建一组相关或有依赖关系的对象,而且无需指定这些对象具体的类. ...

  7. Java设计模式:抽象工厂模式--农场的季节生产对应水果举例

    /*** 农场的抽象.不同季节生产不同的蔬菜和水果.*/ public interface Farm {//不同季节,不同蔬菜和水果.int WINTER = 1; //冬季.int SUMMER = ...

  8. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  9. java设计模式3种工厂模式

    java设计模式3种工厂模式 2010-01-08 16:06:36|  分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...

最新文章

  1. .net中6个重要的基础概念:Stack, heap, Value types, reference types, boxing and Unboxing.
  2. laraver 用户认证auth、数据迁移和填充
  3. javascript之回调函数小知识
  4. Latex 数学公式使用入门
  5. python怎么用lambda和map函数_Python之lambda匿名函数及map和filter的用法
  6. 【HTML5】网页元素的拖放操作
  7. python split()方法_聊聊 Python 的单元测试框架(一):unittest
  8. athena sql_使用SQL Server查询Amazon Athena外部表
  9. XBMC Skinning Manual
  10. Ubuntu 18.04 Server必须使用netplan命令配置IP地址
  11. 安居客Android项目架构演进
  12. 三个比较经典的策略: Dual Thrust、R-Breaker、Dynamic Breakout II
  13. 让手机成为电脑的摄像头,Droidcam(linux) 的安装及使用
  14. 倾斜模型精细化处理_基于倾斜摄影三维建模的模型精细化修复方法研究
  15. 解决office怎么卸载都卸载不干净的终极办法。
  16. 控制服务器系统,控制服务器操作系统
  17. ONF测试工作张攀:OpenFlow控制器性能测试工具进展
  18. 最后一天了(再见了)
  19. 【无标题】2022年施工员-设备方向-通用基础(施工员)考试模拟100题及模拟考试
  20. 数据库 MySQL-window安装和卸载

热门文章

  1. Hive 之 导入导出数据
  2. (51)多路时钟复用概述
  3. (06)Vivado约束基础
  4. (83)FPGA时钟抖动和时钟偏斜-面试必问(七)(第17天)
  5. (7)UART接收verilog与Systemverilog编码
  6. boost 容器tuple 信号signal2测试
  7. STM32驱动LCD实战
  8. 【STM32】STM32CubeMX教程--功能介绍
  9. java实验检查危险品代码_2019JAVA第六次实验报告
  10. 菜鸟学习笔记:Java提升篇10(网络2——UDP编程、TCPSocket通信、聊天室案例)