1. 介绍:
    1. 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
  2. 定义:
    1. 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
  3. 抽象工厂方法的UML图:

  4. 组成:
    1. 抽象工厂:虚拟的造车厂,所有的造车厂的一个概念,是一个规范,也就是代码中的接口
    2. 具体工厂:具体的造车厂,用来造什么样子车的车厂,也就是是程序中的实现类
    3. 抽象产品:车的概念,所有车的抽象化,也就是代码中对车的一个接口
    4. 具体产品:具体的车,什么牌子,什么类型,什么配件,清清楚楚的,也就是抽象产品的一个实现类
  5. 步骤:
    1. 创建抽象工厂类:定义工厂的公共接口

package com.lvsling.abstractfactory;

/**

* 抽象工厂角色,声明了工厂方法

* @author Administrator

*

*/

public interface Factory {

public Engine produceEngine();

public Aircondition produceAircondition();

}

  1. 创建抽象产品类:定义产品的公共接口

package com.lvsling.abstractfactory;

/**

* 抽象产品角色

* @author Administrator

*

*/

public abstract class Aircondition {

}

package com.lvsling.abstractfactory;

/**

* 抽象产品角色

* @author Administrator

*

*/

public abstract class Engine {

}

  1. 创建具体工厂类:定义创建具体产品实例的方法

package com.lvsling.abstractfactory;

/**

* 具体工厂类:实现了产品族产品生产的逻辑

* @author Administrator

*

*/

public class FactoryCarA implements Factory {

public FactoryCarA() {

System.out.println("具体工厂CarA正在生产:");

}

@Override

public Engine produceEngine() {

return new Engine_1();

}

@Override

public Aircondition produceAircondition() {

return new Aircondition_1();

}

}

package com.lvsling.abstractfactory;

/**

* 具体工厂类:实现了产品族产品生产的逻辑

* @author Administrator

*

*/

public class FactoryCarB implements Factory {

public FactoryCarB() {

System.out.println("具体工厂CarB正在生产:");

}

@Override

public Engine produceEngine() {

return new Engine_2();

}

@Override

public Aircondition produceAircondition() {

return new Aircondition_2();

}

}

  1. 创建具体产品类:定义生产具体的产品

package com.lvsling.abstractfactory;

/**

* 具体产品角色

* @author Administrator

*

*/

public class Aircondition_1 extends Aircondition {

public Aircondition_1() {

System.out.println("生产了1空调!");

}

}

package com.lvsling.abstractfactory;

/**

* 具体产品角色

* @author Administrator

*

*/

public class Aircondition_2 extends Aircondition{

public Aircondition_2() {

System.out.println("生产了2空调");

}

}

package com.lvsling.abstractfactory;

/**

* 具体产品角色

* @author Administrator

*

*/

public class Engine_1 extends Engine{

public Engine_1() {

System.out.println("生产了1引擎!");

}

}

package com.lvsling.abstractfactory;

/**

* 具体产品角色

* @author Administrator

*

*/

public class Engine_2 extends Engine{

public Engine_2() {

System.out.println("生产了2引擎!");

}

}

  1. 创建client类:来调用创建不同目标的方法创建不同具体产品类的实例

package com.lvsling.abstractfactory;

public class Client {

public static void main(String[] args) {

Factory factoryA = new FactoryCarA();        //生产A型汽车的配件工厂

Engine engineA = factoryA.produceEngine();

Aircondition airconditionA = factoryA.produceAircondition();

Factory factoryB = new FactoryCarB();

Engine engineB = factoryB.produceEngine();

Aircondition airconditionB = factoryB.produceAircondition();

}

}

  1. 客户端打印:

具体工厂CarA正在生产:

生产了1引擎!

生产了1空调!

具体工厂CarB正在生产:

生产了2引擎!

生产了2空调

  1. 优点:
    1. 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
    2. 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
    3. 增加新的具体工厂和产品族很方便,无须修改已有系统,符合"开闭原则"。
  2. 缺点:
    1. 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对"开闭原则"的支持呈现倾斜性。
  3. 应用场景:
    1. 当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。
    2. 一个继承体系中,如果存在着多个等级结构,并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式
  4. 总结:
    1. 其实,对于简单工厂模式,工厂方法模式,抽象工厂模式不必要过于吹毛求疵,这些模式都属于工厂模式,形式和特点上都有很多相似之处,他们的最终目的都是为了解耦合。提高代码的灵活性和可重用性。在使用时,不必刻意去要求它是工厂方法模式还是抽象工厂模式,需求不同,做相应的更改,明明使用的工厂方法模式,你加了个新方法,在类中的产品中构成了不同等级结构中的产品族,就变成抽象工厂方法了。等价言之,你使用抽象工厂模式,需求不同,你减少了一个方法提供的产品不在构成等级结构的产品族,自然而然就是工厂方法模式了。主要在乎的还是代码的耦合度是否符合我们的目的。

转载于:https://www.cnblogs.com/lvsling/p/8470566.html

设计模式(4)----抽象工厂模式相关推荐

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

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

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

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

  3. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

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

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

  5. 设计模式之四(抽象工厂模式第三回合)

    原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...

  6. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  7. 设计模式-04抽象工厂模式

    设计模式-04抽象工厂模式 文章中涉及到的代码,请自行下载 https://gitee.com/pan_xiao_lei123/designmode.git 前面介绍的工厂方法模式中考虑的是一类产品的 ...

  8. C#设计模式(4)——抽象工厂模式

    C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法 ...

  9. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

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

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

最新文章

  1. 查看Windows端口及端口关闭方法
  2. 最优化课堂笔记06-无约束多维非线性规划方法(续)
  3. android 播放声音资源,android播放音效例子 (翻页音效、警报音效通用 只需传入声音源)...
  4. 带你掌握二进制SCA检测工具的短板及应对措施
  5. JS组件系列——Bootstrap Select2组件使用小结
  6. JAVA-idea中maven配置
  7. 编程基本功:正常运行的代码,你看明白能做什么?不如解决几个简单BUG
  8. matlab矩阵除法
  9. 爬虫应对银行安全控件
  10. 华为安装gsm框架_华为nova5怎么下载安装谷歌服务助手,安装GMS框架教程
  11. 基于php工程项目管理系统
  12. 计算机修理工具包价格,电脑修复工具包#200多个联想工程师专用电脑修复小工具打包...
  13. 允许计算机usb调试,usb调试不弹出授权,电脑一直弹出无法识别USB
  14. 讯飞语音集成(语音转文字,文字转语音)
  15. root格式化linux,Linux-格式化与检验-mkfs
  16. php fpm工作原理,phpfpm工作原理是什么?
  17. JS实现限制可移动div的移动范围
  18. 中国军工电子行业运营模式及十四五发展规划咨询建议报告2022-2027年
  19. 《现代控制理论》第5章
  20. location.origin

热门文章

  1. android统计测试题,Allocation Tracker(Android Studio)
  2. latex max下面标注怎么写
  3. 【Django 2021年最新版教程15】数据库定义 models字段类型 限制 用法 总结
  4. kubernetes视频教程笔记 (26)-集群调度-节点亲和性
  5. 桂电管理科学可以转计算机,去年调到桂电计算机的感言,希望对各研友有帮助...
  6. css 对话框 水平居中,css 水平居中的几种方法
  7. Leetcode之回文数
  8. python第七天--文件练
  9. 在jquery中想要找到所以同辈元素方法_在jquery中siblings找到所有元素的同辈元素,是什么意思,有人可以给我详细讲解一下不?...
  10. 定时任务莫名停止,Spring 定时任务存在 Bug??