java设计模式【抽象工厂模式】

抽象工厂模式

抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类。在这个模式中,我们只关心产品的抽象接口,而将具体的产品实现留给子类去实现。这样,我们可以通过创建不同的工厂对象来创建不同的产品实例,而无需关心它们实际实现的是哪个具体产品。

抽象工厂模式的实现分为以下几个步骤:

  1. 定义抽象产品接口:抽象工厂模式的核心是抽象产品接口,它定义了产品的基本结构和行为。
  2. 定义具体工厂接口:具体工厂接口是实现抽象产品接口的工厂类,它们负责创建具体产品实例。
  3. 定义工厂:每个具体工厂都是一个特定领域的工厂,它实现了抽象工厂接口,并提供了具体的产品实现。
  4. 创建产品实例:使用抽象工厂接口,客户端可以创建不同的产品实例,而无需指定具体的子类。

优缺点

优点:

  1. 具体产品在应用层的代码隔离,无需关系创建的细节。
  2. 将一个系列的产品统一到一起创建,方便产品族的扩展。
  3. 提供一个产品类的库,所有的产品以同样的接口出现,使得客户端不依赖于具体实现。
  4. 通过创建不同的工厂对象来创建不同的产品实例,无需关心它们实际实现的是哪个具体产品。

缺点:

  1. 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难。
  2. 增加了系统的抽象性和理解难度。
  3. 使用场景:客户端(应用层)不依赖与产品类的实现等细节。
  4. 需要大量的重复代码,增加了开发和维护的成本。

使用场景

  1. 一个系统要独立于它的产品的创建、组合和表示时。
  2. 一个系统要由多个产品系列中的一个来配置时。
  3. 需要强调一系列相关的产品对象的设计以便进行联合使用时。
  4. 提供一个产品类库,而只想显示它们的接口而不是实现时。
  5. 产品之间相互关联、相互依赖且相互约束的地方。

具体实现

以下以智能产品汽车和手机为例,继承关系如下:

定义抽象工厂

  1. /**
  2. * 智能产品抽象工厂
  3. */
  4. public interface SmartProductFactory {
  5. ISmartPhone createSmartPhone();
  6. ISmartCar createSmartCar();
  7. }

具体工厂

  1. /**
  2. * @author physicx
  3. * @date 2023/5/17 上午11:18
  4. * @desc 华为工厂
  5. * Created with IntelliJ IDEA
  6. */
  7. public class HuaweiFactory implements SmartProductFactory {
  8. @Override
  9. public ISmartPhone createSmartPhone() {
  10. return new HuaweiSmartPhone();
  11. }
  12. @Override
  13. public ISmartCar createSmartCar() {
  14. return new HuaweiSmartCar();
  15. }
  16. }
  1. /**
  2. * @author guogq
  3. * @date 2023/5/17 上午11:18
  4. * @desc 小米工厂
  5. * Created with IntelliJ IDEA
  6. */
  7. public class XiaomiFactory implements SmartProductFactory {
  8. @Override
  9. public ISmartPhone createSmartPhone() {
  10. return new XiaomiSmartPhone();
  11. }
  12. @Override
  13. public ISmartCar createSmartCar() {
  14. return new XiaomiSmartCar();
  15. }
  16. }

定义抽象产品

  1. /**
  2. * 智能手机
  3. */
  4. public interface ISmartPhone {
  5. void printInfo();
  6. }
  1. /**
  2. * 智能汽车
  3. */
  4. public interface ISmartCar {
  5. void printInfo();
  6. }

具体产品

  1. /**
  2. * @author physicx
  3. * @date 2023/5/17 上午11:19
  4. * @desc 华为智能汽车
  5. * Created with IntelliJ IDEA
  6. */
  7. public class HuaweiSmartCar implements ISmartCar {
  8. @Override
  9. public void printInfo() {
  10. System.out.println("华为智能汽车");
  11. }
  12. }
  1. /**
  2. * @author guogq
  3. * @date 2023/5/17 上午11:19
  4. * @desc 华为智能手机
  5. * Created with IntelliJ IDEA
  6. */
  7. public class HuaweiSmartPhone implements ISmartPhone {
  8. @Override
  9. public void printInfo() {
  10. System.out.println("华为智能手机");
  11. }
  12. }
  1. /**
  2. * @author guogq
  3. * @date 2023/5/17 上午11:19
  4. * @desc 小米智能汽车
  5. * Created with IntelliJ IDEA
  6. */
  7. public class XiaomiSmartCar implements ISmartCar {
  8. @Override
  9. public void printInfo() {
  10. System.out.println("小米智能汽车");
  11. }
  12. }
  1. /**
  2. * @author guogq
  3. * @date 2023/5/17 上午11:19
  4. * @desc 小米智能手机
  5. * Created with IntelliJ IDEA
  6. */
  7. public class XiaomiSmartPhone implements ISmartPhone {
  8. @Override
  9. public void printInfo() {
  10. System.out.println("小米智能手机");
  11. }
  12. }

客户端调用

  1. public static void main(String[] args) {
  2. HuaweiFactory huaweiFactory = new HuaweiFactory();
  3. huaweiFactory.createSmartPhone().printInfo();
  4. huaweiFactory.createSmartCar().printInfo();
  5. XiaomiFactory xiaomiFactory = new XiaomiFactory();
  6. xiaomiFactory.createSmartPhone().printInfo();
  7. xiaomiFactory.createSmartCar().printInfo();
  8. }

打印如下:

工厂方法模式和抽象工厂模式区别

工厂方法模式和抽象工厂模式都是创建型模式,区别如下:

  1. 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
  2. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
  3. 工厂方法模式的使用很简单,只要继承成子类,并实现工厂方法的工厂就可以了,而抽象工厂模式需要先实例化它,然后将它传入一些针对抽象类型所写的代码中。
  4. 工厂方法模式的优点是可以把一群相关的产品集合起来,而抽象工厂模式的优点是可以把一群相关的产品集合起来,并且创建整个产品家族的模式。

总之,工厂方法是由子类自行决定实例化那个类,而抽象工厂是自己决定实例化哪个类。至于是组合还是继承还是实现接口都无所谓。根本区别在于是自己实例化还是子类实例化。

如果产品单一,只有一个产品等级结构适合使用工厂方法模式。如果存在多个产品等级,产品分类多个可以形成产品族合适使用抽象工厂模式。

补充说明

后续会依次更新 详解java 23种设计模式,欢迎关注、交流、补充相关内容(如下)。

快捷导航
设计模式简介总结
单例模式详解
工厂方法模式
抽象工厂模式

java设计模式【抽象工厂模式】的更多相关文章

  1. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  2. Java设计模式-抽象工厂模式(Abstract Factory )

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

  3. 2.java设计模式-抽象工厂模式

    抽象工厂模式简介: 每一个模式都是针对某一种问题的解决方案.抽象工厂模式与工厂模式最大的区别在于,工厂模式针对的是一个产品等级结构,而抽象工厂模式面对的是多个产品等级结构,即产品族的概念. 这里讲解一 ...

  4. Java设计模式-抽象工厂模式(Abstarct Factory)

    抽象工厂模式 举个生活中常见的例子,组装电脑,在组装电脑时,通常需要选择一系列的配件,比如CPU,硬盘,内存,主板,电源,机箱等,为了讨论使用简单,值考虑选择CPU和主板的问题. 事实上,在选择CPU ...

  5. Java设计模式——抽象工厂模式

    抽象工厂模式也是创建模式,可以把它理解成创建工厂的工厂,这种模式也是我们经常使用的.在抽象工厂中的接口是用来创建工厂的,每个生成的工厂又都可以按照工厂模式创建其他对象. 举例说明: 创建Shape接口 ...

  6. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  9. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  10. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

随机推荐

  1. 一篇文章带你快速入门学习RPA

    大纲: 什么是RPA? RPA的应用领域有哪些? RPA机器人技术一般用于什么行业? RPA的市场需求是什么? RPA项目的实施过程? RPA的未来趋势怎么样?   什么是RPA?   RPA 全称& ...

  2. 针对于Sql server突然连接不到服务器的解决方法

    问题叙述 点击连接之后,总是会弹出一个错误弹窗: 方法解决 快捷键Win+R,输入services.msc,进入到服务界面: 找到SQL 代理(DEV) 将手动打开改成自动 再连接试一次 连上啦! ( ...

  3. 在golang中如何正确判断接口是否为nil

    本文主要来分析一下在golang中,如何判断interface是否为nil,以及相关注意事项. 正常情况下,我们声明一个interface类型的变量,默认值将会返回nil,以golang自带的io.W ...

  4. webgl 系列 —— 渐变三角形

    其他章节请看: webgl 系列 渐变三角形 本文通过一个渐变三角形的示例逐步分析:varying变量.合并缓冲区.图形装配.光栅化.varying 内插 绘制三个点v1 需求:绘制三个相同颜色的点, ...

  5. [WinUI 3] 如何利用D3D11在SwapChainPanel控件上绘制OpenGL(Uwp通用)

    预览 技术实现 看过我上篇在 WPF 中实现 OpenGL 与 D3D 渲染的同学应该知道,我是依靠 WGL 中 WGL_NV_DX_interop 扩展与 D3D Surface 关联并在使用该 S ...

  6. JS逆向实战10——某集团RSA长加密

    由于本网站较为特殊 目标网站加密与其他稍有不同 目标网站 68747470733a2f2f65632e6d696e6d6574616c732e636f6d2e636e2f6f70656e2f686f6 ...

  7. 【责任链设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    简介 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,也叫职责链模式.命令链模式.这种模式为请求创建了一个接收者对象的链,允许你将请求沿着处理者链进行 ...

  8. 设计模式(三十)----综合应用-自定义Spring框架-自定义Spring IOC-定义bean、注册表相关类

    现要对下面的配置文件进行解析,并自定义Spring框架的IOC对涉及到的对象进行管理. <?xml version="1.0" encoding="UTF-8&qu ...

  9. 系统评价——层次分析法AHP的R语言实现(四)

    对一个事物的评价往往会涉及多个因素或者多个指标,评价是在多个因素相互作用下的一个综合判断.多指标综合评价方法具有以下的特点:包含若干个指标,分别说明被评价对象的不同方面,评价方法最终要对被评价对象作出 ...

  10. Kubernetes学习之旅

    # Kubernetes学习之旅 ## 引言 - 为什么选择Kubernetes- Kubernetes简介- Kubernetes的发展历程 ## Kubernetes基本概念 - 节点(Node) ...