设计模式-创建型模式之工厂设计模式

news2024/9/24 22:48:55

文章目录

    • 五、工厂方法
    • 六、抽象工厂

五、工厂方法

工厂方法,使用工厂可以像使用人员屏蔽对象创建的细节,使用者无需指定具体的类即可使用功能,达到信息隐蔽的作用,便于后期的维护,修改和扩展

在看工厂方法前还有一类是 简单工厂,相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知道产品类所对应的参数即可。但是工厂的职责过重,而且当类型过多时不利于系统的扩展维护。
在这里插入图片描述

比如我们在聚合支付的时候有,微信支付和支付宝支付,在不同的选择要获取不同的对象,如果用简单方法来实现的话:

  1. 先定义统一的支付抽象类,定义支付和取消支付抽象方法
public interface PayInterFace {
    //支付
    void pay();
    //取消支付
    void cancelPay();
}
  1. 定义微信支付类
public class WxPay implements PayInterFace {
    @Override
    public void pay() {
        System.out.println("微信支付中...");
    }

    @Override
    public void cancelPay() {
        System.out.println("微信取消支付!");
    }
}
  1. 定义支付宝类
public class ZfbPay implements PayInterFace {
    @Override
    public void pay() {
        System.out.println("支付宝支付中...");
    }

    @Override
    public void cancelPay() {
        System.out.println("支付宝取消支付!");
    }
}
  1. 创建简单工厂
public class SimplePayFactory {
    public static PayInterFace getPay(String payType) {
        if (Objects.equals(payType, "wx")) {
            return new WxPay();
        } else if (Objects.equals(payType, "zfb")) {
            return new ZfbPay();
        } else {
            return null;
        }
    }
}
  1. 使用
public class demo {
    public static void main(String[] args) {
        PayInterFace pay = SimplePayFactory.getPay("wx");
        pay.pay();
        pay.cancelPay();
        PayInterFace pay1 = SimplePayFactory.getPay("zfb");
        pay1.pay();
        pay1.cancelPay();
    }
}

在这里插入图片描述

通过传入不同的标识获取不同的对象,且无需指定具体对象,让使用者无需关注创建对象的细节,增加对象需要在工厂中添加对应的实例化程序,当类型过多时不利于系统的扩展维护。

那下面来看下工厂方法的做法:

  1. 在上面的基础上,再建立 支付工厂接口:
public interface PayFactory {
    PayInterFace getPay();
}
  1. 建立微信支付工厂
public class WxPayFactory implements PayFactory {
   @Override
   public PayInterFace getPay() {
       return new WxPay();
   }
}
  1. 建立支付宝工厂
public class ZfbPayFactory implements PayFactory {
    @Override
    public PayInterFace getPay() {
        return new ZfbPay();
    }
}
  1. 使用
public class demo {
    public static void main(String[] args) {
        PayInterFace pay = new WxPayFactory().getPay();
        pay.pay();
        pay.cancelPay();

        PayInterFace pay1 = new ZfbPayFactory().getPay();
        pay1.pay();
        pay1.cancelPay();
    }
}

这种方式同样屏蔽了对象建立的细节,且无需指定具体对象,但相对于上面的简单工厂,更易于做扩展,比如要引入新的支付,只需要创建新的工厂并实现PayFactory 即可,更利于系统的扩展。

六、抽象工厂

上面学习了简单工厂工厂方法,下面来看下抽象工厂
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

在上面的场景中,加入支付后需要扣除库存,就需要引入库存工厂,并调用扣除库存的方法,库存工厂和支付工厂貌似不相干,但在抽象工厂中,抽象工厂相当于一个公司,库存和支付相当与部门,相对于公司来看,支付和库存都是公司下的部门,是一个整体。所以抽象工厂就是定义一个产品组,可以完成一系列的过程,而不是单一的活动。

下面使用抽象工厂定义支付后扣除库存的设计:

  1. 定义库存操作接口
public interface RepertoryInterFace {
    void deductRepertory();
}
  1. 以苹果为例,定义具体库存为苹果的库存
public class AppleRepertory implements RepertoryInterFace {
    @Override
    public void deductRepertory() {
        System.out.println("苹果库存 扣除库存...");
    }
}
  1. 定义抽象工厂,定义支付和扣库存抽象方法
public interface BuyAbstractFactory {
    //支付
    PayInterFace pay();
    //扣库存
    RepertoryInterFace deductRepertory();
}
  1. 定义抽象工厂实现,这里演示效果,直接采用微信支付对象
public class BuyAbstractFactoryImpl implements BuyAbstractFactory {

    @Override
    public PayInterFace pay() {
        return new WxPay();
    }

    @Override
    public RepertoryInterFace deductRepertory() {
        return new AppleRepertory();
    }
}
  1. 使用
public class demo {
    public static void main(String[] args) {
        BuyAbstractFactory factory = new BuyAbstractFactoryImpl();
        factory.pay().pay();
        factory.deductRepertory().deductRepertory();
    }
}

在这里插入图片描述

使用抽象工厂方式,颗粒化程度大,让使用者无需知道整个工作组的对象,即可完成一连串的操作,对可扩展性,可修改修都很友好

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

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

相关文章

低代码究竟有何特别之处?为什么很多企业倾向于用低代码开发软件?

目录 一、低代码是什么 二、低代码有哪些核心能力? 三、低代码能做哪些事情? 1、软件开发快效率高 2、满足企业的多样化需求 3、轻松与异构系统集成 4、软件维护成本低 5、为企业实现降本增效 四、结语 低代码平台正高速发展中,越来越多的企业…

Windows10找不到hosts文件的解决办法

正常情况下hosts文件在目录C:\Windows\System32\drivers\etc中,最近新装的Windows10系统发现该目录下没有hosts文件。 如下操作显示隐藏文件发现还是没有。 执行如下命令hosts文件出现: for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P …

时间序列异常检测14篇顶会论文合集,附必备工具和数据集

今天来聊聊一个在量化交易、网络安全检测、自动驾驶汽车和大型工业设备的日常维护等领域都有重要作用的研究主题:时间序列异常检测。 时间序列异常检测是一种在时间序列数据中识别和标识与预期模式、趋势或行为不符的异常点或事件的技术。鉴于它如此广泛的应用范围…

HP1010 | 业界首款图腾柱 PFC 专用数字控制器震撼来袭!

随着节能标准和客户需求的不断提高,电源解决方案的效率和尺寸也在不断优化,设计紧凑高效的 PFC 电源是一个复杂的开发挑战。随着第三代半导体器件氮化镓和碳化硅的大范围应用,图腾柱无桥 PFC(TPPFC)应用获得极大的拓展…

IDEA解决Git冲突详解

目录 前言: 何为冲突 冲突演示 IDEA冲突解决 小结: 前言: 相信大家多多少少都有了解和使用过Git,作为Java程序员idea可谓是无敌的存在了,那么如何使用idea解决Git冲突呢?不瞒大家前段时间在公司把同事…

Java arthas分析接口性能

一、环境准备 1、arthas文档: 简介 | arthas 2、下载arthas-boot.jar https://arthas.aliyun.com/arthas-boot.jar 二、启动arthas java -jar arthas-boot.jar 输入对应pid,进入对应服务 三、排查 1、执行命令: trac 类路径 方法名 tr…

编写算法,对n个关键字取整数值的记录序列进行整理。以使所有关键字为负值的记录排在关键字为非负值的记录之前

编写算法,对n个关键字取整数值的记录序列进行整理。以使所有关键字为负值的记录排在关键字为非负值的记录之前,要求: (1)采用顺序存储结构,至少使用一个记录的辅助存储空间 (2)算法的…

大数据HCIE成神之路之数学(4)——最优化实验

最优化实验 1.1 最小二乘法实现1.1.1 算法介绍1.1.2 代码实现1.2 梯度下降法实现1.2.1 算法介绍1.2.2 代码实现1.3 拉格朗日乘子法1.3.1 实验1.3.2 实验操作步骤1.1 最小二乘法实现 1.1.1 算法介绍 最小二乘法(Least Square Method),做为分类回归算法的基础,有着悠久的历…

智能配电箱监控系统

智能配电箱监控系统是一种用于实时监控配电箱运行状态和电能质量的系统。它通过集成应用物联网技术,实现对配电箱的数据采集、整合和处理,从而让工作人员能够远程了解和掌握配电箱的情况。通过电力设备的数字化,依托电易云-智慧电力物联网&am…

JVM 字节码

JVM概述 问题引出 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认吧&…

Redis安装和部署详细流程

文章目录 一、Windows环境下安装 Redis1.1 下载Redis1.2 启动redis服务器1.3 启动redis客户端1.4 配置环境变量 参考资料 一、Windows环境下安装 Redis windows系统环境下,redis安装方式主要有: zip压缩包方式 https://redis.io/download 或者 https:/…

智慧机场视频监控系统方案:AI智能助力机场智慧运营

一、方案背景 随着人们生活物质水平的上升,人们对机场的需求也日益增多,在民航新建、迁建、扩建机场项目猛增的同时,也需同步配备相应的安防监控系统,以满足民航机场安全管理要求和机场运营业务的高速发展。 二、方案概述 智慧机…

主机的容器化技术介绍

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、什么是容器 容器是一个标准化的单元,是一种轻量级、可移植的软件打包技术,容器将软件代码及其相关依赖打包,使应用程序可以在任何计算介质运行。例如开发人员在自己的…

Sui受邀参加Builder DAO举办的LeadUp The Night活动,畅谈Sui与Move语言

LeadUp the Night是一个定期举办的MeetUp活动,由Builder DAO邀请区块链各方项目开发者、VC担任本活动的讲师。这个活动旨在促进区块链技术的发展和应用,让参与者有机会开发创新的区块链应用,探索区块链技术的潜力。 ​​11月30日受BuilderDA…

全球市场:12个冷门海外媒体推广平台值得尝试

随着互联网的迅猛发展和全球市场的日益融通,跨国企业的海外推广变得越来越重要。大多数企业只关注知名的社交媒体平台和搜索引擎,忽略了一些冷门但价值巨大的海外媒体推广平台。本文将介绍12个冷门的海外媒体推广平台,帮助您进一步扩大全球市…

openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态

文章目录 openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态135.1 检查办法135.2 操作步骤135.3 异常处理 openGauss学习笔记-135 openGauss 数据库运维-例行维护-检查openGauss健康状态 135.1 检查办法 通过openGauss提供的gs_check工具可以开展o…

《开箱元宇宙》:Madballs 解锁炫酷新境界,人物化身系列大卖

你是否曾想过,元宇宙是如何融入世界上最具代表性的品牌和名人的战略中的?在本期的《开箱元宇宙》 系列中,我们与 Madballs 的战略顾问 Derek Roberto 一起聊聊 Madballs 如何在 90 分钟内售罄 2,000 个人物化身系列,以及是什么原…

一文看懂:库存分析如何做?

在之前的文章中,老李给大家简单介绍了制造业数据分析用到的指标体系和典型分析场景。如果你读过那篇文章,你就会知道制造业主要有两个典型的分析场景,一是库存管理,二是生产管理。虽然老李在之前的文章中提到了这两个场景&#xf…

羊大师提问,为什么吃得越咸越容易出现健康问题?

羊大师提问,为什么吃得越咸越容易出现健康问题? 在现代社会中,有一种追求咸味食物的趋势,许多人都钟爱于吃咸味食物。吃咸味食物往往容易导致健康问题,引发各种疾病。那么为什么吃的越咸越容易生病呢? 今…

对话汪源:数智时代为企业构建新的竞争力,和网易数帆的“为与不为”

CodeWave在内的诸多“主演”正在重新演绎网易数帆,在网易数帆的新故事里,做专业、底层、核心的工具,是其成长至今最核心的底色。 作者|斗斗 编辑|皮爷 出品|产业家 “我希望在中间层能构建一个好的生态。”网易汪源的这句话,让…