【设计模式】创建型-抽象工厂模式

news2024/11/17 11:25:23

前言

在软件开发领域,设计模式是一种被广泛接受的解决方案,用于解决特定问题并提供可维护和可扩展的代码结构。抽象工厂模式(Abstract Factory Pattern)是其中之一,它提供了一种方法来创建一系列相关或相互依赖的对象,而无需指定其具体类。

一、什么是抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定其具体实现类。抽象工厂模式通过引入抽象工厂接口和一组抽象产品接口,允许客户端使用抽象接口来创建一系列相关的产品对象,从而使得产品的创建过程与客户端解耦。

二、抽象工厂模式的核心组成部分

抽象工厂模式通常涉及以下几个角色:

  1. 抽象工厂(Abstract Factory): 定义了一个创建一系列产品的接口,每个方法用于创建一个具体产品的对象。
  2. 具体工厂(Concrete Factory): 实现了抽象工厂接口,负责创建具体的产品对象。
  3. 抽象产品(Abstract Product): 定义了产品的接口,描述了产品的特性。
  4. 具体产品(Concrete Product): 实现了抽象产品接口,具体描述了产品的特性。

在这里插入图片描述

三、运用工厂方法模式

场景假设:我们正在开发一个汽车销售系统,需要根据不同的汽车品牌(如奥迪、宝马)来创建轿车和卡车。

  1. 定义抽象工厂接口: 首先,需要定义一个抽象工厂接口,其中声明了一组用于创建产品的抽象方法。这些方法通常对应于不同产品族的创建。

    // Step 1: 定义抽象工厂接口
    interface CarFactory {
        Car createCar();
        Truck createTruck();
    }
    
  2. 定义抽象产品接口: 接着,需要定义一组抽象产品接口或抽象类,其中声明了产品的通用行为或特性。

    // Step 2: 定义抽象产品接口
    interface Car {
        void drive();
    }
    
    interface Truck {
        void drive();
    }
    
  3. 实现具体产品类: 对于每个产品族,需要实现相应的具体产品类,这些具体产品类分别实现了抽象产品接口,具体描述了产品的特性和行为。

    // Step 3: 实现具体产品类
    class AudiCar implements Car {
        @Override
        public void drive() {
            System.out.println("Driving an Audi car");
        }
    }
    
    class AudiTruck implements Truck {
        @Override
        public void drive() {
            System.out.println("Driving an Audi truck");
        }
    }
    
    class BMWCar implements Car {
        @Override
        public void drive() {
            System.out.println("Driving a BMW car");
        }
    }
    
    class BMWTruck implements Truck {
        @Override
        public void drive() {
            System.out.println("Driving a BMW truck");
        }
    }
    
  4. 实现具体工厂类: 对于每个产品族,需要实现一个具体工厂类,该类实现了抽象工厂接口,并负责创建该产品族的具体产品对象。

    // Step 4: 实现具体工厂类
    class AudiFactory implements CarFactory {
        @Override
        public Car createCar() {
            return new AudiCar();
        }
    
        @Override
        public Truck createTruck() {
            return new AudiTruck();
        }
    }
    
    class BMWFactory implements CarFactory {
        @Override
        public Car createCar() {
            return new BMWCar();
        }
    
        @Override
        public Truck createTruck() {
            return new BMWTruck();
        }
    }
    
  5. 客户端使用抽象工厂: 最后,客户端通过抽象工厂接口来获取产品对象,而不直接依赖于具体的产品类。客户端只需知道抽象工厂接口和抽象产品接口,而不需要了解具体的产品类。

    // Step 5: 客户端使用抽象工厂
    public class Client {
        public static void main(String[] args) {
            // 创建奥迪汽车系列
            CarFactory audiFactory = new AudiFactory();
            Car audiCar = audiFactory.createCar();
            Truck audiTruck = audiFactory.createTruck();
    
            audiCar.drive();
            audiTruck.drive();
    
            // 创建宝马汽车系列
            CarFactory bmwFactory = new BMWFactory();
            Car bmwCar = bmwFactory.createCar();
            Truck bmwTruck = bmwFactory.createTruck();
    
            bmwCar.drive();
            bmwTruck.drive();
        }
    }
    

四、抽象工厂模式的特点

  1. 提供一组相关产品的创建接口: 抽象工厂模式提供了一个抽象工厂接口,其中包含一组用于创建相关产品的方法。这些方法通常对应于不同产品族的创建需求。
  2. 实现产品族的创建: 抽象工厂模式通过具体工厂类的实现来实现不同产品族的创建。每个具体工厂类负责创建特定产品族的对象。
  3. 封装性强: 客户端通过抽象工厂接口来获取产品对象,而不需要了解具体的产品类。这种封装性强的特点使得客户端与具体产品类解耦,从而降低了系统的耦合度。
  4. 易于替换: 在抽象工厂模式中,只需替换具体工厂的实现,即可改变产品系列,而不会影响到客户端的代码。这使得系统更加灵活,并且易于扩展和维护。
  5. 满足单一职责原则: 每个具体工厂类只负责创建特定产品族的对象,符合单一职责原则,使得系统的设计更加清晰和易于理解。
  6. 适用于多个产品族的创建: 抽象工厂模式适用于需要创建一系列相关或相互依赖的对象,并且这些对象通常组成多个产品族的场景。例如,不同操作系统下的界面控件、不同汽车品牌的车型等。

五、抽象工厂模式的应用场景

抽象工厂模式适用于以下几种场景:

  1. 需要创建一系列相关产品的情况: 当一个系统需要创建一系列相关或相互依赖的对象,并且这些对象通常组成多个产品族时,可以使用抽象工厂模式。例如,GUI 库中不同操作系统下的界面控件(如按钮、文本框)就属于不同的产品族。
  2. 需要跨越多个产品族的对象创建情况: 当一个系统需要跨越多个产品族的对象时,可以使用抽象工厂模式。例如,在汽车销售系统中,根据不同汽车品牌(如奥迪、宝马)来创建轿车和卡车就属于不同的产品族。

六、小结

抽象工厂模式是一种强大的设计模式,它提供了一种灵活的方法来创建一系列相关的对象,并且能够有效地降低系统的耦合度。通过将对象的创建与其使用分离,抽象工厂模式使得系统更加灵活、可扩展,并且易于维护。在实际开发中,合理地运用抽象工厂模式可以使代码更加清晰、结构更加健壮。

推荐阅读

  1. Spring 三级缓存
  2. 深入了解 MyBatis 插件:定制化你的持久层框架
  3. Zookeeper 注册中心:单机部署
  4. 【JavaScript】探索 JavaScript 中的解构赋值
  5. 深入理解 JavaScript 中的 Promise、async 和 await

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1704814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(三)MobaXterm、VSCode、Pycharm ssh连接服务器并使用

背景:根据前两篇文章操作完成后, 手把手教学,一站式安装ubuntu及配置服务器-CSDN博客 手把手教学,一站式教你实现服务器(Ubuntu)Anaconda多用户共享-CSDN博客 课题组成员每人都有自己的帐号了&#xff0…

上海亚商投顾:沪指震荡反弹 半导体产业链午后爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡反弹,尾盘涨幅扩大至1%,深成指、创业板指同步上行,科创50指数…

实时直播技术革新:视频汇聚管理EasyCVR平台助力景区游览体验全面升级

自年初以来,各地文旅热点不断。“温暖驿站”“背诗免票”“王婆说媒”等等,吸引了不少人奔赴远方。2024年在国人消费意愿榜上,旅游又一次占据榜首的位置,有三分之一以上的人,今年会在旅游方面增加消费。中国旅游的发展…

【已解决】./start-base.sh: line 5: $‘\r‘: command not found

问题:在linux下运行启动服务的脚本,提示很多‘\r’不可用。 原因:windows下编辑的文件,放在linux下运行,文件格式有问题,需要转换。 解决方法: 1、用vim编辑器打开文件 vim 文件名 2、进入…

Matplotlib(可视化)小案例

一.认识: Matplotlib是一个Python 2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形。Matplotlib可用于Python脚本,Python和IPython shell,Jupyter笔记本,Web应用程序服务器和四个图…

K8S-pod资源 探针

一.pod资源限制: 对pod资源限制原因:高并发占用所有的cpu资源、内存资源、会造成雪崩 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 方式: 对pod做…

二叉树的实现(递归实现)

前言:本文讲解通过递归的方式实现二叉树的一些基本接口。 目录 通过左右子树的方式实现二叉树: 二叉树的遍历: 求二叉树结点的个数: 二叉树所有节点的个数: 二叉树叶子节点的个数: 求第k层节点的节点…

学习编程对英语要求高吗?

学习编程并不一定需要高深的英语水平。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。 虽然一些编程资源和文档可能…

公务员申论答题稿纸

申论答题稿纸网上不太好找,这里给大家分享两个版本,一个是在PDD上买到的稿纸样式,一种是那种考场答题样式,每个题都给你留有答题位置。第一种合适大家日常练习,比如说练字,第二种就适合答题的时候用了。 …

硬盘的分区

目录 概念 硬盘的分区 实操 创建分区 fdisk&#xff08;<2T&#xff09; 创建文件系统 挂载 自动挂载&#xff08;永久挂载&#xff09; gpt区分 swap 交换分区 如何删除已挂载的分区 概念 硬盘&#xff1a;计算机的存储设备。&#xff08;如无特殊说明&#xff0…

区间预测 | Matlab实现GRU-Attention-KDE核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现GRU-Attention-KDE核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现GRU-Attention-KDE核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现GRU-Attention-KDE门控循环单元注意力…

移动端应用订阅SDK接入攻略

本文档介绍了联想应用联运移动端订阅SDK接入操作指南&#xff0c;您可在了解文档内容后&#xff0c;自行接入应用联运移动端订阅SDK。 接入前准备 1请先与联想商务达成合作意向。 2.联系联想运营&#xff0c;提供应用和公司信息&#xff0c;并获取商户id、app id、key&#…

Python编程之旅:从错误到精通的奇妙探险

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、初识Python编程的陷阱与解决方案 1. 语法错误&#xff1a;防范于未然 2. 逻辑错误&…

流媒体内网穿透/组网/视频协议转换EasyNTS上云网关如何更改密码?

EasyNTS上云网关的主要作用是解决异地视频共享/组网/上云的需求&#xff0c;网页对域名进行添加映射时&#xff0c;添加成功后会生成一个外网访问地址&#xff0c;在浏览器中输入外网访问地址&#xff0c;即可查看内网应用。无需开放端口&#xff0c;EasyNTS上云网关平台会向Ea…

shell脚本读写二进制文件

文章目录 shell脚本读写二进制文件读取二进制文件使用xxd命令使用od命令 写入二进制文件使用echo和printf 读取和修改二进制文件使用dd命令 组合使用工具 shell脚本读写二进制文件 在Shell脚本中处理二进制文件时&#xff0c;可以使用一些常用的命令和工具来读取和写入二进制数…

Leetcode刷题笔记5

76. 最小覆盖子串 76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a; 暴力枚举 哈希表 先定义left和right&#xff0c;可以在随机位置 枚举一个位置向后找&#xff0c;找到一个位置之后&#xff0c;发现这段区间是一个最小的区间之后&#xff0c…

C++ day1 作业练习

整理思维导图 定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置。 #include <iostream> #include <cstring>using namespace std; namespace my_space {string s1; }void show() {cout<…

ONLYOFFICE 协作空间与 WordPress 如何集成

转载自作者&#xff1a;VincentYoung&#xff0c;略有改动 阅读本文&#xff0c;了解如何将 ONLYOFFICE 协作空间与 WordPress 进行集成。 ONLYOFFICE 协作空间是其去年新推出的产品&#xff0c;用创建虚拟办公室房间的方式&#xff0c;来组织公司内部团队成员的在线协作办公&…

FBA头程空运物流的运输时效与计费方式解析

FBA头程空运物流&#xff0c;是运用专业的货机或搭载货物的客机&#xff0c;为轻小商品提供的一种直接、迅速的配送服务。它尤其适合时间紧促的物流伙伴&#xff0c;尽管相较于其他运输方式&#xff0c;空运成本可能稍高&#xff0c;但其卓越的时效性为物流伙伴带来了极高的性价…

单片机的内存映射和重映射

内存映射 在单片机内&#xff0c;不管是RAM还是ROM还是寄存器&#xff0c;他们都是真实存在的物理存储器&#xff0c;为了方便操作&#xff0c;单片机会给每一个存储单元分配地址&#xff0c;这就叫做内存映射。 单片机的内存映射是指将外部设备或外部存储器映射到单片…