【设计模式系列】工厂方法模式(二十一)

一、什么是工厂方法模式

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,其核心目的是定义一个创建对象的接口,但让实现这个接口的子类来决定实例化哪一个类。工厂方法模式让类的实例化推迟到子类中进行,从而提高了代码的灵活性和可扩展性。

二、工厂方法模式的角色

    • 抽象工厂(Creator):定义创建产品的接口,它声明了工厂方法,该方法返回一个抽象产品类型的实例。抽象工厂的目的是制定所有具体工厂类必须遵循的接口

    • 具体工厂(Concrete Creator):实现抽象工厂的接口,它实现了工厂方法,该方法返回一个具体产品的实例。具体工厂负责创建具体的产品对象,并返回这个对象

    • 抽象产品(Product):定义了产品的接口或抽象类,这个接口或抽象类是所有具体产品类的共同父类。它声明了产品对象必须实现的接口。

    • 具体产品(Concrete Product):实现或继承抽象产品的接口或抽象类,它提供了抽象产品的具体实现。具体产品是最终由具体工厂创建的对象。

三、工厂方法模式的典型应用场景

  1. 客户端不依赖产品类实例的创建细节: 当客户端不需要知道具体产品类的创建细节时,工厂方法模式可以提供给客户端一个统一的接口,客户端只需要关心产品的接口,而不需要知道具体的实现类 。

  2. 创建对象需要大量重复的代码: 当创建某个对象的过程需要执行一系列复杂的操作时,使用工厂方法模式可以将这些操作封装在具体工厂类中,避免在多个地方重复这些操作 。

四、工厂方法模式在NumberFormat中的应用

这里以NumberFormat为例,展示一下工厂方法模式的应用,主要包含以下几个部分:

  • 抽象产品(NumberFormatter 接口):定义了数字格式化的统一接口。
  • 具体产品(DecimalFormatter、IntegerFormatter、CurrencyFormatter):实现了不同的格式化逻辑。
  • 工厂类(NumberFormat):提供了静态工厂方法 getFormatter(),根据传入的格式化类型返回相应的格式化器实例,使用枚举 FormatType 来定义支持的格式化类型。

我们先来创建抽象的 NumberFormatter 接口:

public interface NumberFormatter {
    String format(Number number);
} 

然后创建具体的格式化实现类(这里以DecimalFormatter、IntegerFormatter为例):

public class DecimalFormatter implements NumberFormatter {
    @Override
    public String format(Number number) {
        return String.format("%.2f", number.doubleValue());
    }
} 
public class IntegerFormatter implements NumberFormatter {
    @Override
    public String format(Number number) {
        return String.format("%d", number.intValue());
    }
} 
public class CurrencyFormatter implements NumberFormatter {
    @Override
    public String format(Number number) {
        return String.format("$%.2f", number.doubleValue());
    }
} 

创建一个具体工厂类:

public class NumberFormat {
    // 工厂方法,根据不同类型返回对应的格式化器
    public static NumberFormatter getFormatter(FormatType type) {
        switch (type) {
            case DECIMAL:
                return new DecimalFormatter();
            case INTEGER:
                return new IntegerFormatter();
            case CURRENCY:
                return new CurrencyFormatter();
            default:
                throw new IllegalArgumentException("Unsupported format type");
        }
    }

    // 格式化类型枚举
    public enum FormatType {
        DECIMAL,
        INTEGER,
        CURRENCY
    }
} 

最后,写一个客户端方法:

public class NumberFormatDemo {
    public static void main(String[] args) {
        double number = 1234.5678;

        // 获取不同的格式化器
        NumberFormatter decimalFormatter = NumberFormat.getFormatter(NumberFormat.FormatType.DECIMAL);
        NumberFormatter integerFormatter = NumberFormat.getFormatter(NumberFormat.FormatType.INTEGER);
        NumberFormatter currencyFormatter = NumberFormat.getFormatter(NumberFormat.FormatType.CURRENCY);

        // 使用不同的格式化器格式化数字
        System.out.println("Decimal format: " + decimalFormatter.format(number));  // 输出:1234.57
        System.out.println("Integer format: " + integerFormatter.format(number));  // 输出:1234
        System.out.println("Currency format: " + currencyFormatter.format(number)); // 输出:$1234.57
    }
} 

使用这种模式,我们可以轻松地管理不同的数字格式化需求,并且在需要添加新的格式化方式时,不会影响到现有的代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIE:详解OSPF,从基础到高级特性再到深入研究

目录 前言 一、OSPF协议基本原理 简介 基本原理 OSPF路由器类型 OSPF网络类型 OSPF报文类型和封装 OSPF邻居的建立的维护 DR和BDR的选举 伪节点 LSDB的更新 OSPF的配置 二、OSPF的高级特性 虚连接(Virtual-Link) OSPF的LSA和路由选择 OSPF…

分享一款 Vue 图片编辑插件 (推荐)

💥本篇文章给大家分享一款强大到没朋友的Vue图片编辑插件,可以对图片进行旋转、缩放、裁剪、涂鸦、标注、添加文本等,快来试试并收藏吧!💕 这是一款对图片进行旋转、缩放、裁剪、涂鸦、标注、添加文本在线处理的图片处…

【时间之外】IT人求职和创业应知【53】-东莞也转型

目录 新闻一:Freysa挑战赛:人类智慧与策略战胜AI,奖金高达4.7万美元 新闻二:中国生成式AI用户规模突破2.3亿,行业应用广泛 新闻三:2024东莞智能终端新技术推广会圆满举行,聚焦AI与智能终端融…

大模型在推荐系统中的应用

引言 推荐系统在现代互联网应用中扮演着至关重要的角色。从电商到社交媒体,再到音乐与视频流媒体服务,推荐系统通过分析用户行为数据和内容特征,为用户提供个性化服务。近年来,大模型(Large Language Models, LLMs&…

Electron + vue3 打包之后不能跳转路由

路由不跳转问题原因: 是因为electron需要将vue-router的mode调整为hash模式(两种写法) export default new Router({mode: hash, //这里history修改为hashscrollBehavior: () > ({y: 0}),routes: constantRouterMap, }) export default new createRouter({his…

Linux网络_网络协议_网络传输_网络字节序

一.协议 1.概念 协议(Protocol) 是一组规则和约定,用于定义计算机网络中不同设备之间如何进行通信和数据交换。协议规定了数据的格式、传输方式、传输顺序等详细规则,确保不同设备和系统能够有效地互联互通。 在网络通信中&#…

Unity3D UI 嵌套滚动视图

Unity3D 解决 UI 嵌套滚动视图滑动问题。 嵌套滚动视图 滑动问题 在游戏开发中,我们常常会遇到一种情况,在一个滚动视图列表中,每个 item 还包含了一个内嵌的滚动视图。 这样,当我们在滑动外层的滚动视图时,如果点…

QT6学习第五天 第一个QT Quick程序

QT6学习第五天 第一个QT Quick程序 概述创建Qt Quick程序使用Qt资源文件程序发布 概述 如果将程序的用户界面成为前端,程序的数据存储和逻辑业务成为后端,那么传统QT Widgets程序的前后端都是用C完成的。对于现代软件开发而言,前端演化速度远…

【C++】单目操作符详解:前置与后置自增自减及正负号操作

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯单目操作符概述1 自增与自减操作符: 和 --2 前置 和 后置 案例 1:前置 案例 2:后置 小技巧 3 前置 -- 和 后置 --案例 1:前…

SAP SD学习笔记15 - 投诉处理2 - 返品处理流程之 参照请求传票(发票)来生成返品传票

上一章讲了返品处理(退货处理)的流程。 SAP SD学习笔记14 - 投诉处理1 - 返品处理(退货处理)的流程以及系统实操,比如 返品传票;请求Block标记;收到退货之后的处理,请求传票的登录_…

【C语言】二叉树(BinaryTree)的创建、3种递归遍历、3种非递归遍历、结点度的实现

代码主要实现了以下功能: 二叉树相关数据结构定义 定义了二叉树节点结构体 BiTNode,包含节点数据值(字符类型)以及指向左右子树的指针。 定义了顺序栈结构体 SqStack,用于存储二叉树节点指针,实现非递归遍历…

【博主推荐】C# Winform 拼图小游戏源码详解(附源码)

文章目录 前言摘要1.设计来源拼图小游戏讲解1.1 拼图主界面设计1.2 一般难度拼图效果1.3 普通难度拼图效果1.4 困难难度拼图效果1.5 地域难度拼图效果1.6 内置五种拼图效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载结束语 前言 在数字浪潮汹涌澎湃的时代,程序开…

C++初阶(十七)--STL--stack和queue详解及使用

目录 stack 概念 stack的定义 stack的使用 queue 概念 queue的定义 queue的使用 在 C 的标准模板库(STL)中,stack(栈)和queue(队列)是非常重要的容器适配器。它们基于其他基础容器实现&…

【ubuntu24.04】GTX4700 配置安装cuda

筛选显卡驱动显卡驱动 NVIDIA-Linux-x86_64-550.135.run 而后重启:最新的是12.6 用于ubuntu24.04 ,但是我的4700的显卡驱动要求12.4 cuda

远程桌面协助控制软件 RustDesk v1.3.3 多语言中文版

RustDesk 是一款开源的远程桌面软件,支持多平台操作,包括Windows、macOS、Linux、iOS、Android和Web。它提供端到端加密和基于角色的访问控制,确保安全性和隐私保护。使用简单,无需复杂配置,通过输入ID和密码即可快速连…

【Linux】gdb / cgdb 调试 + 进度条

🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、Linux调试器-gdb 🌟开始使用 🌠小贴士: 🌟gdb指令 🌠小贴士: ✨watch 监视 ✨打条件断点 二、小程序----进…

C++初阶——动态内存管理

目录 1、C/C内存区域划分 2、C动态内存管理:malloc/calloc/realloc/free 3、C动态内存管理:new/delete 3.1 new/delete内置类型 3.2 new/delete自定义类型 4、operator new与operator delete函数 5、new和delete的实现原理 5.1 内置类型 5.2 自定…

开发一套ERP 第八弹 RUst 插入数据

更全面的报错,方便检查错误在哪里,现代高级语言越来越智能 还是得看下原文档怎么操作的 src 目录为crate 的根目录 想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用 原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出…

【学习笔记】基于RTOS的设计中的堆栈溢出(Stack Overflow)-第1部分

本文由RTOS专家Jean J. Labrosse撰写。 基于RTOS的应用程序中的每个任务都需要自己的堆栈,堆栈的大小取决于任务的要求(例如,函数调用嵌套、传递给函数的参数、局部变量等)。 为了避免堆栈溢出,开发人员需要过度分配堆栈空间,但不要太多,以避免浪费RAM。 什么是堆栈溢…

基于java+SpringBoot+Vue的教学辅助平台设计与实现

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven mysql5.7或8.0等等组成&#x…