Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【设计模式】抽象工厂模式 ( 简介 | 适用场景 | 优缺点 | 产品等级结构和产品族 | 代码示例 )

【设计模式】抽象工厂模式 ( 简介 | 适用场景 | 优缺点 | 产品等级结构和产品族 | 代码示例 )

作者头像
韩曙亮
发布于 2023-03-29 07:37:09
发布于 2023-03-29 07:37:09
95100
代码可运行
举报
运行总次数:0
代码可运行

文章目录

一、抽象工厂模式简介


抽象工厂模式 : 提供 一个 创建 一系列 相关 或 相互依赖 对象 的接口 ;

创建目标对象时 , 只需要直到对象的抽象类型或接口类型即可 , 不需要知道具体的实现类型 ;

抽象工厂模式类型 : 创建型 ;

抽象工厂模式 可以将 一组具有同一主题 , 单独的工厂 封装起来 ; 在使用时 , 客户端 创建 抽象工厂 的实现 , 使用 抽象工厂 作为接口 , 来创建这一主题的对象 ; 使用的时候 , 不需要知道 从内部 工厂方法中获得的 对象 的具体类型 ; 客户端 只 使用这些对象的 通用接口 ;

抽象工厂模式 实现了 一组对象的 实现细节 与 使用 分离 ;

二、抽象工厂模式适用场景


抽象工厂模式适用场景 :

  • 忽略创建细节 : 客户端 不关心 产品实例 如何 被创建 , 实现等细节 ;
  • 创建产品族 : 强调 一系列 相关的 产品对象 , 一般是 同一个产品族 , 一起使用 创建对象需要大量重复的代码 ;
  • 产品类库 : 提供 一个 产品类 的库 , 所有的产品 以 同样的接口出现 , 使 客户端不依赖于具体实现 ;

使用抽象工厂模式 , 可以在工厂变化时 , 不需要修改 客户端 使用工厂的 代码 ;

三、抽象工厂模式优缺点


抽象工厂模式优点 :

  • 隔离产品代码 : 在 应用层 隔离 具体产品的代码 , 客户端 无须关心 产品创建 的细节 ;
  • 创建产品族 : 将 一个系列 的 产品族 , 统一到一起创建 ;

抽象工厂模式缺点 :

  • 扩展困难 : 规定了 所有 可能 被创建 的 产品集合 , 产品族 中 扩展 新的产品 困难 , 需要 修改抽象工厂的接口 ;
  • 增加难度 : 增加了系统的 抽象性 和 理解难度 ;

四、产品等级结构和产品族


下图中 , 有 椭圆形 , 圆形 , 正方形 , 三种产品 ;

  • 产品族 : 相同颜色的代表一个产品族 ;
  • 产品等级结构 : 相同形状的代表同一个产品等级结构 ;

如 : 方型 - 洗衣机 , 圆形 - 空调 , 椭圆 - 冰箱 ;

  • 横向 看 产品族 : 某 品牌下 有 方型 - 洗衣机 , 圆形 - 空调 , 椭圆 - 冰箱 , 这是一个产品族 ;
  • 纵向看产品等级结构 : 椭圆 - 冰箱 , 纵向指的是不同品牌的冰箱 ;

工厂方法模式 针对的是 产品等级结构 , 可以 扩展多个相同的产品 ;

抽象工厂模式 针对的是 产品族 , 在 某个品牌 的工厂中取出 洗衣机 类 , 取出的肯定是 该品牌的洗衣机实例对象 ;

只要指出 产品所在的 产品族 以及 产品所在的 产品等级结构 , 就可以唯一确定一个产品 ;

左侧的 纵坐标轴 上的 工厂 是 具体的工厂 , 从该具体的工厂中 创建的实例 是 该产品族中的实例 ;

使用 工厂模式 还是 抽象工厂模式 , 要看具体的业务场景 ; 当一个工厂 可以 创建 分属于 不同 产品等级结构 的 一个 产品族 中的 不同对象时 , 使用 抽象工厂模式 ;

如 :

  • 工厂 中可以创建 相同品牌的 洗衣机 , 冰箱 , 空调 等产品 , 使用 抽象工厂模式 ;
  • 如果 工厂中创建 不同品牌的空调 , 则使用 工厂方法模式 ;

五、抽象工厂模式代码示例


如果要新增 产品族 , 只需要增加 产品族工厂 , 对应的产品类 即可 ; 如果要新增 产品等级 , 很麻烦 , 需要修改所有的产品族工厂 , 这就违背了开闭原则 ;

产品等级结构固定 , 需要多个产品组合在一起形成产品族的 业务场景 , 适合使用抽象工厂模式 ;

业务场景 : 有两个电器品牌 , 美的 和 格力 ; 每个品牌下都有 冰箱 和 空调 产品 ;

1、冰箱抽象类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package abstractfactory;

/**
 * 冰箱抽象类
 */
public abstract class Fridge {
    public abstract void produce();
}

2、美的冰箱实现类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package abstractfactory;

/**
 * 美的冰箱
 */
public class MideaFridge extends Fridge {
    @Override
    public void produce() {
        System.out.println("生产美的冰箱");
    }
}

3、格力冰箱实现类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package abstractfactory;

/**
 * 格力冰箱
 */
public class GreeFridge extends Fridge {
    @Override
    public void produce() {
        System.out.println("生产格力冰箱");
    }
}

4、空调抽象类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package abstractfactory;

/**
 * 空调抽象类
 */
public abstract class AirConditioner {
    public abstract void produce();
}

5、美的空调实现类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package abstractfactory;

/**
 * 美的空调
 */
public class MideaAirConditioner extends AirConditioner {
    @Override
    public void produce() {
        System.out.println("生产美的空调");
    }
}

6、格力空调实现类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package abstractfactory;

/**
 * 格力空调
 */
public class GreeAirConditioner extends AirConditioner {
    @Override
    public void produce() {
        System.out.println("生产格力空调");
    }
}

7、工厂抽象接口 ( 重点 )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package abstractfactory;

/**
 * 抽象工厂方法
 */
public interface Factory {
    /**
     * 生产冰箱
     * @return
     */
    Fridge getFridge();

    /**
     * 生产空调
     * @return
     */
    AirConditioner getAirConditioner();
}

8、美的工厂实现类 ( 重点 )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package abstractfactory;

/**
 * 美的工厂
 */
public class MideaFactory implements Factory {
    @Override
    public Fridge getFridge() {
        return new MideaFridge();
    }

    @Override
    public AirConditioner getAirConditioner() {
        return new MideaAirConditioner();
    }
}

9、格力工厂实现类 ( 重点 )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package abstractfactory;

/**
 * 格力抽象工厂
 */
public class GreeFactory implements Factory {
    @Override
    public Fridge getFridge() {
        return new GreeFridge();
    }

    @Override
    public AirConditioner getAirConditioner() {
        return new GreeAirConditioner();
    }
}

10、测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package abstractfactory;

public class Main {
    public static void main(String[] args) {
        // 生产 美的 品牌的 冰箱 和 空调
        Factory mideaFactory = new MideaFactory();

        // 美的冰箱
        Fridge mideaFridge = mideaFactory.getFridge();
        mideaFridge.produce();

        // 美的空调
        AirConditioner mideaAirConditioner = mideaFactory.getAirConditioner();
        mideaAirConditioner.produce();

        System.out.println();

        // 生产 格力 品牌的 冰箱 和 空调
        Factory greeFactory = new GreeFactory();

        // 格力冰箱
        Fridge greeFridge = greeFactory.getFridge();
        greeFridge.produce();

        // 格力空调
        AirConditioner greeFridgeAirConditioner = greeFactory.getAirConditioner();
        greeFridgeAirConditioner.produce();
    }
}

执行结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
生产美的冰箱
生产美的空调

生产格力冰箱
生产格力空调
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 列表、元组、字典及集合操作
注意:当索引超出范围时,Python会报一个IndexError错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(list1) - 1。
py3study
2020/01/19
1.5K0
python列表、元组、字典
列表是由一序列特定顺序排列的元素组成的。可以把字符串,数字,字典等都可以任何东西加入到列表中,列表中的元素之间没有任何关系。列表也是自带下标的,默认也还是从0开始。列表常用方括号表示,即:[],元素用逗号隔开。
py3study
2020/01/15
1.3K0
刚才,我发现了Python强大的内置模块collections
collections 是 Python 的一个内置模块,所谓内置模块的意思是指 Python 内部封装好的模块,无需安装即可直接使用。
Wu_Candy
2022/07/05
3130
Python字典和集合
1 字典字典和列表类似,同样是可变序列,不过与列表不同,字典是无序的。主要特征解释通过键而不是通过索引来读取元素字典类型有时也称为关联数组或者散列表(hash)。它是通过键将一系列的值联系起来的,这样就可以通过键从字典中获取指定项,但不能通过索引来获取。字典是任意数据类型的无序集合和列表、元组不同,通常会将索引值 0 对应的元素称为第一个元素,而字典中的元素是无序的。字典是可变的,并且可以任意嵌套字典可以在原处增长或者缩短(无需生成一个副本),并且它支持任意深度的嵌套,即字典存储的值也可以是列表或其它的字典
虫无涯
2023/02/02
8640
python-for-data-python基础
本文主要是对Python的数据结构进行了一个总结,常见的数据结构包含:列表list、元组tuple、字典dict和集合set。
皮大大
2021/03/01
1.3K0
python-for-data-python基础
Python黑帽编程2.3 字符串、列表、元组、字典和集合
本节要介绍的是Python里面常用的几种数据结构。通常情况下,声明一个变量只保存一个值是远远不够的,我们需要将一组或多组数据进行存储、查询、排序等操作,本节介绍的Python内置的数据结构可以满足大多数情况下的需求。这一部分的知识点比较多,而且较为零散,需要认真学习。 2.3.1 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符串。 创建字符串很简单,只要为变量分配一个值即可。例如: var1 ='Hello World!' var2 ="Python Runoob
用户1631416
2018/04/12
1.8K0
Python黑帽编程2.3 字符串、列表、元组、字典和集合
Python基础语法(四)—列表、元组、字典、集合、字符串
列表 基本概念 列表是有序的元素集合,所有元素放在一对中括号中,用逗号隔开,没有长度限制; 列表索引值以0为开始值,-1为从未尾的开始位置。 列表可以使用+操作符进行拼接,使用*表示重复。 当列表元素增加或删除时,列表对象自动进行扩展或收缩内存,保证元素之间没有缝隙; 列表中的元素可以是不同类型的 列表的使用方式 list = ["zeruns","blog","blog.zeruns.tech",9527,[0,1,2,[1,2]]]#创建一个列表,一个列表里可以有多种数据类型,甚至可以嵌套列表来做二或三
zeruns
2020/03/23
2.6K0
python基础语法——函数、列表、元组和字典
本文基于pycharm编译器,也可以使用Anaconda 里的编译器,将讲解一些python的一些基础语法知识,是对上篇文章的补充,可以和我写的python数据分析——Python语言基础(数据结构基础)结合起来看,有些知识点可能在这篇文章写的不是很全面。
鲜于言悠
2024/03/20
2230
python基础语法——函数、列表、元组和字典
【Python】python创建字典(dict)的几种方法(含代码示例)
字典(Dictionary)是Python中一种非常灵活的数据结构,用于存储键值对(key-value pairs)。在Python中创建字典有多种方法,每种方法都有其特定的使用场景和优势。
程序员洲洲
2024/06/09
1.8K0
【Python】python创建字典(dict)的几种方法(含代码示例)
Python复习 一
从上边可以看出,list直接复制和list[:]分片复制的结果一样,但其实暗藏心急哦!
Mirror王宇阳
2020/11/13
1.3K0
Python3快速入门(三)——Pyth
Python3 中有六种标准数据类型: A、Number(数字) B、String(字符串) C、List(列表) D、Tuple(元组) E、Set(集合) F、Dictionary(字典) Python3 的六种标准数据类型中,Number(数字)、String(字符串)、Tuple(元组)是不可变的,List(列表)、Dictionary(字典)、Set(集合)是可变的。
py3study
2020/01/06
3.7K0
2.0 Python 数据结构与类型
数据类型是编程语言中的一个重要概念,它定义了数据的类型和提供了特定的操作和方法。在 python 中,数据类型的作用是将不同类型的数据进行分类和定义,例如数字、字符串、列表、元组、集合、字典等。这些数据类型不仅定义了数据的类型,还为数据提供了一些特定的操作和方法,例如字符串支持连接和分割,列表支持排序和添加元素,字典支持查找和更新等。因此,选择合适的数据类型是 python 编程的重要组成部分。
王瑞MVP
2023/08/11
6080
python-元组,字典,列表
由于会处理一些json数据,内部字典,列表,元租傻傻分不清,所以这里总结一下他们的特点,便于提取数据 想要知道跟多看官方文档,很详细 https://www.runoob.com/python/python-lists.html 我是看了官方文档后总结后我自己的
全栈程序员站长
2021/05/19
1.2K0
python列表、字典、元组、集合学习笔记
列 表 列表在python里是有序集合对象类型。 列表里的对象可以是任何对象:数字,字符串,列表或者字典,元组。与字符串不同,列表是可变对象,支持原处修改的操作 python的列表是:
没有故事的陈师傅
2019/07/28
2.3K0
Python教程第3章 | 集合(List列表、Tuple元组、Dict字典、Set)
前面我们学习了基本数据类型和变量,现在我们学习Python的四种集合,列表(List)和元组(tuple),字典(Dict),无序列表(Set)
仲君Johnny
2024/01/24
1.1K0
Python教程第3章 | 集合(List列表、Tuple元组、Dict字典、Set)
python学习笔记(2)python数据类型
整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。
大数据小禅
2021/08/16
8640
【利用Python进行数据分析】3-Python的数据结构、函数和文件
元组是一个固定长度,不可改变的Python序列对象,创建元组的最简单方式,是用逗号分隔一列值。当用复杂的表达式定义元组,最好将值放到圆括号内。
用户7886150
2020/12/24
8860
一天快速入门python
Python 是由Guido Van Rossum在 90 年代早期设计,现在是最常用的编程语言之一。特别是人工智能的火热,再加之它的语法简洁且优美,实乃初学者入门AI必备的编程语言。
yuquanle
2019/05/27
8590
python文档:数据结构(列表的特性,del语句,元组,集合,循环技巧)字典,
本章节将详细介绍一些您已经了解的内容,并添加了一些新内容。 5.1. 列表的更多特性 列表数据类型还有很多的方法。这里是列表对象方法的清单:
川川菜鸟
2021/10/18
1.6K0
Python元组与字典
例:d2=dict(name="jerry",age="45",gender="m")
py3study
2020/01/10
9230
推荐阅读
相关推荐
Python 列表、元组、字典及集合操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验