定义:为创建一组相关或相互依赖的对象提供一个接口,并且无需指定他们的详细类。

类型:创建类模式

类图:

抽象工厂模式与工厂方法模式的差别

抽象工厂模式是工厂方法模式的升级版本号,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的差别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的全部产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。

在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依旧拿生产汽车的样例来说明他们之间的差别。

在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品族。再详细一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于还有一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于还有一个产品族。

明确了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的差别了,假设工厂的产品所有属于同一个等级结构,则属于工厂方法模式;假设工厂的产品来自多个等级结构,则属于抽象工厂模式。在本例中,假设一个工厂模式提供2.0排量两厢车和2.4排量两厢车,那么他属于工厂方法模式;假设一个工厂模式是提供2.4排量两厢车和2.4排量三厢车两个产品,那么这个工厂模式就是抽象工厂模式,由于他提供的产品是分属两个不同的等级结构。当然,假设一个工厂提供所有四种车型的产品,由于产品分属两个等级结构,他当然也属于抽象工厂模式了。

抽象工厂模式代码

interface IProduct1 {public void show();
}
interface IProduct2 {public void show();
}class Product1 implements IProduct1 {public void show() {System.out.println("这是1型产品");}
}
class Product2 implements IProduct2 {public void show() {System.out.println("这是2型产品");}
}interface IFactory {public IProduct1 createProduct1();public IProduct2 createProduct2();
}
class Factory implements IFactory{public IProduct1 createProduct1() {return new Product1();}public IProduct2 createProduct2() {return new Product2();}
}public class Client {public static void main(String[] args){IFactory factory = new Factory();factory.createProduct1().show();factory.createProduct2().show();}
}

抽象工厂模式的长处

抽象工厂模式除了具有工厂方法模式的长处外,最基本的长处就是能够在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就能够在类内部对产品族的关联关系进行定义和描写叙述,而不必专门引入一个新的类来进行管理。

抽象工厂模式的缺点

产品族的扩展将是一件十分费力的事情,假如产品族中须要添加一个新的产品,则差点儿全部的工厂类都须要进行改动。所以使用抽象工厂模式时,对产品等级结构的划分是很重要的。

适用场景

当须要创建的对象是一系列相互关联或相互依赖的产品族时,便能够使用抽象工厂模式。说的更明确一点,就是一个继承体系中,假设存在着多个等级结构(即存在着多个抽象类),而且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就能够使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。

总结

不管是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的终于目的都是为了解耦。在使用时,我们不必去在意这个模式究竟工厂方法模式还是抽象工厂模式,由于他们之间的演变经常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加改动,增加了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当降低一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

所以,在使用工厂模式时,仅仅须要关心减少耦合度的目的是否达到了。

23种设计模式(3):抽象工厂模式相关推荐

  1. 23种设计模式之抽象工厂模式(Abstract Factory Pattern)

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习.本篇文章将23种设计模式中的抽象工厂模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识. 如果文章有什么需要改进的地方还请 ...

  2. 23种设计模式之简单工厂模式,工厂方法模式,抽象工厂模式详解

    工厂模式详解 1. 简单工厂模式 1.1 需求分析 1.2 使用传统方式实现 1.2.1 类图 1.2.2 代码实现 1.2.2.1 新建pizza抽象类 1.2.2.2 希腊披萨实现类 1.2.2. ...

  3. java 工厂模式的写法_Java23种设计模式之抽象工厂模式

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

  4. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  5. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  6. 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...

  7. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

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

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

  9. 设计模式复习-抽象工厂模式

    设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...

  10. 设计模式——4.抽象工厂模式

    1. 模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一 ...

最新文章

  1. 利用OpenCV实现基于深度学习的超分辨率处理
  2. java中的循环语句类型_java 循环 基本类型
  3. 如何判断一个对话机器人有多智能?
  4. python 事件通知模式_请问在 Python 的事件系统中,如何可以通过事件通知立刻终结一个正在运行的子线程?...
  5. JavaScript内存释放
  6. JAX-RS和OpenAPI对Hypermedia API的支持:任重而道远
  7. 超详攻略!Databricks 数据洞察 - 企业级全托管 Spark 大数据分析平台及案例分析
  8. 【BAT面试现场】如何判断一个数是否在40亿个整数中?
  9. C3P0连接池问题,APPARENT DEADLOCK!!! Creating emergency..... [问题点数:20分,结帖人lovekong]...
  10. 计算机操作师初级理论知识试卷答案,[计算机操作员初级理论知识试卷1.doc
  11. Sublime Text3 python交互式环境+快捷键设置
  12. extjs中什么时候用{},什么时候用[]
  13. RDS binglog
  14. JDK 8 函数式编程入门
  15. winform 鼠标 静止时间_四款蓝牙鼠标的详细使用体验对比
  16. Java对象和Map相互转换方法
  17. Linux运维基础知识
  18. SMTP,POP3协议邮件Wireshark抓包实验及内容还原
  19. 【证明】欧拉公式(泰勒展开)
  20. javascript系列-class6.String类型

热门文章

  1. Android Gradle指南系列
  2. Lync Server 2013 安装体验(二)
  3. Netflix推出Hollow,处理内存数据集的Java库
  4. c++ stl string char* 向 string 转换的问题
  5. 【转】做一名开源社区的扫地僧 (上)
  6. 初级算法——删除排序数组中的重复项
  7. java静态引用_Java开发中静态方法引用和实例方法引用案例详细讲解
  8. virbox protector 为软件设置有效期_条码软件如何打印UCC-128条形码
  9. android 选择银行类型,『自定义View实战』—— 银行种类选择器
  10. CCPC-EDG专场——E.Buy and Delete