设计模式中的静态工厂,到底解决了什么问题?

设计模式中的静态工厂,到底解决了什么问题?

文章目录

  • 设计模式中的静态工厂,到底解决了什么问题?
  • 一、基本说明
  • 二、代码演示
    • 1、名称更明确
    • 2、不必每次调用都创建新对象
    • 3、返回接口类型
    • 4、降低客户端和具体实现之间的耦合
    • 5、参数化实例创建

一、基本说明

静态工厂模式是一种创建型设计模式,通常是通过一个静态方法创建实例对象,而不是通过构造函数直接暴露给客户端。静态工厂模式解决了以下主要问题:

  1. 名称更明确:构造函数本身没有名称,它们仅通过参数列表进行区分。如果一个类需要多种方法来初始化其对象,静态工厂方法可以有描述性的名称,使得客户端代码更容易理解和使用。
  2. 不必每次调用都创建新对象:如果应用需要重用实例,静态工厂方法可以控制其创建过程。例如,单例模式或者缓存已经创建的实例,可以通过静态工厂方法返回这些实例,避免了不必要的对象创建。
  3. 返回接口类型:静态工厂方法返回的可以是接口类型,进而提高了模块的可扩展性,用户只需知道接口而不必关心具体实现,方便替换不同的实现
  4. 降低客户端和具体实现之间的耦合:客户端只依赖于静态工厂返回的抽象类型(如接口或抽象类),实际的类可以在不更改客户端代码的情况下自由更换
  5. 参数化实例创建:可以通过传递参数给静态工厂方法来动态地选择返回哪一个具体实现的对象。

尽管静态工厂模式有很多优点,但它也有一些缺点,如下所述:

  • 类如果不含有 public 或 protected 的构造函数,那么就不能被子类化
  • 静态工厂方法与其他的静态方法实际上没有任何区分,对于编程新手可能会造成理解上的困惑。

总而言之,静态工厂方法是一种非常有用的设计模式,它提供了一种比构造函数更灵活的对象创建机制。它可以让你的代码更加清晰、灵活和易于维护。

二、代码演示

1、名称更明确

public class RGBColor {private int red;private int green;private int blue;// 私有构造方法,避免外部直接使用new来创建对象private RGBColor(int red, int green, int blue) {this.red = red;this.green = green;this.blue = blue;}// 静态工厂方法,名称明确表示创建对象的意图public static RGBColor fromRGB(int red, int green, int blue) {return new RGBColor(red, green, blue);}public static RGBColor fromHex(String hex) {// 解析hex字符串并创建RGBColor对象int red = ...int green = ...int blue = ...return new RGBColor(red, green, blue);}// ...其他属性和方法
}

2、不必每次调用都创建新对象

public class BooleanWrapper {private boolean value;private BooleanWrapper(boolean value) {this.value = value;}private static final BooleanWrapper TRUE = new BooleanWrapper(true);private static final BooleanWrapper FALSE = new BooleanWrapper(false);public static BooleanWrapper valueOf(boolean value) {return value ? TRUE : FALSE;}
}

3、返回接口类型

public interface Shape {void draw();
}public class Circle implements Shape {public void draw() {System.out.println("Drawing a circle.");}// 静态工厂方法返回接口类型public static Shape newShape() {return new Circle();}
}// 客户端代码
public class Client {public static void main(String[] args) {Shape shape = Circle.newShape(); // 接口类型指向具体实现类的对象shape.draw();}
}

4、降低客户端和具体实现之间的耦合

public interface MessageService {void sendMessage(String message);
}// 具体实现
public class EmailService implements MessageService {public void sendMessage(String message) {System.out.println("Sending email with message: " + message);}
}// 工厂类
public class MessagingFactory {public static MessageService getEmailService() {return new EmailService();}
}// 客户端代码,只关心MessageService接口
public class Client {public static void main(String[] args) {MessageService messageService = MessagingFactory.getEmailService();messageService.sendMessage("Hello World!");}
}

5、参数化实例创建

public enum ShapeType {CIRCLE,RECTANGLE
}public class ShapeFactory {public static Shape getShape(ShapeType type) {switch (type) {case CIRCLE:return new Circle();case RECTANGLE:return new Rectangle();default:throw new IllegalArgumentException("Shape type not recognized.");}}
}// 客户端代码
public class Client {public static void main(String[] args) {Shape shape = ShapeFactory.getShape(ShapeType.CIRCLE);shape.draw(); // 绘制圆形shape = ShapeFactory.getShape(ShapeType.RECTANGLE);shape.draw(); // 绘制矩形}
}

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

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

相关文章

Maya 2024 for Mac(3D建模软件)

Maya 2024是一款三维计算机图形软件,具有强大的建模、动画、渲染、特效等功能,广泛应用于影视、游戏、广告等行业。以下是Maya 2024软件的主要功能介绍: 建模:Maya 2024具有强大的建模工具,包括多边形建模、曲面建模、…

数据可视化在监控易中的艺术与实践

在数字化运维管理中,数据可视化成为一种日益重要的工具,它将复杂的数据通过图形化的方式呈现,帮助运维团队更加直观和快速地理解系统的运行状况。监控易(MeiXin Era)将数据可视化引入到运维监控中,通过科学…

浅谈Elasticsearch 文档操作

Elasticsearch 文档操作 Elasticsearch 是一个基于 Lucene 的分布式搜索引擎,它提供了全文搜索、结构化搜索、分析等功能。在 Elasticsearch 中,文档操作是一个重要的功能,包括文档的索引、更新、删除以及批量操作。本文将详细介绍 Elastics…

【工程实践】Docker使用记录

前言 服务上线经常需要将服务搬到指定的服务器上,经常需要用到docker,记录工作中使用过dcoker指令。 1.写Dockerfile 1.1 全新镜像 FROM nvidia/cuda:11.7.1-devel-ubuntu22.04ENV WORKDIR/data/Qwen-14B-Chat WORKDIR $WORKDIR ADD . $WORKDIR/RUN ap…

洗地机是智商税吗?洗地机有没有必要买?2023洗地机推荐

传统的扫地拖地方式不仅时间长,被毛孩子和萌娃制造的顽固污渍更是让人头痛不已,高效又有效的地面清洁方式成了我们最大的诉求。目前洗地机受到青睐,异常火爆,也成为一众清洁扫地的选择之一,那洗地机到底是不是智商税呢…

C语言从入门到精通之【printf和scanf函数】

printf()是输出函数,scanf()是输入函数,但是它们的工作原理几乎相同。两个函数都使用格式字符串和参数列表。 printf()函数的格式 printf( 格式字符串, 待打印项1, 待打印项2,…);待打印项1、待打印项2等都是要打印的项。它们可以是变量、常量&#xff…

业务出海之服务器探秘

这几年随着国内互联网市场的逐渐饱和,越来越多的公司加入到出海的行列,很多领域都取得了很不错的成就。虽然出海可以获得更加广阔的市场,但也需要面对很多之前在国内可能没有重视的一些问题。集中在海外服务器的选择维度上就有很大的变化。例…

使用validator实现枚举类型校验

使用validator实现枚举类型校验 前言: 在前端调用后端接口传递参数的过程中,我们往往需要对前端传递过来的参数进行校验,比如说我们此时需要对用户的状态进行更新,而用户的状态只有正常和已删除,并且是在代码中通过枚…

react ts实现一个 无限加载组件

页面滑动到底部,直接加载下一页数据 InfiniteScroll.tsx /*** 无限 加载组件*/import { FC, createRef, useEffect, CSSProperties } from react import LoadingText from ../LoadingTexttype PropsType {loadMore: () > voidhasMore: boolean }const Infinit…

【华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS】

MD[华为云IaaS基础三件套----计算、网络、存储] 华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS 说明: 这里只是简单从计算/网络/存储,进行介绍,阐明云上对于云下的优势;因ECS是三者综合,故最后说明。 1.网络----弹性公…

STM32 HAL库多路PWM没有输出踩坑记录

之前只弄过单路的,这次想用4路PWM,CUBE里面一顿配置,生成,然后套用之前的代码: HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); 这算是开启第一路了,心想后面无非就复制几条,改下通道的事了&…

算法----删掉一个元素以后全为 1 的最长子数组

题目 给你一个二进制数组 nums ,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组,请返回 0 。 提示 1: 输入:nums [1,1,0,1] 输出&…

Day02_《MySQL索引与性能优化》

文章目录 一、SQL执行顺序二、索引简介1、关于索引2、索引的类型Btree 索引Btree 索引 三、Explain简介四、Explain 详解1、id2、select_type3、table4、type5、possible_keys6、key7、key_len8、ref9、rows10、Extra11、小案例 五、索引优化1、单表索引优化2、两表索引优化3、…

安装 Lua 的 HTTP 库

首先,你需要安装 Lua 的 HTTP 库。可以使用 LuaRocks 来安装。以下是安装命令: luarocks install http然后,你可以使用以下代码来爬取网页内容: local http require http-- 设置代理信息 http.set_proxy(jshk.com.cn)-- 网页UR…

灵活运用Vue指令:探究v-if和v-for的使用技巧和注意事项

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、作…

为什么打开idea时,没有启动页面,如何解决?

更新idea2021.2后,当双击idea打开时,发现没有启动界面,直接进入IDEA界面,中间等待时间,让人误以为没有打开idea成功,使得多次点击idea图标。 解决方案就是 在idea界面菜单栏中找到帮助(Help)&a…

全域全自主建设,亚信科技AntDB数据库助力广电5G业务上线运行

自2019年6月,中国广电成功获得5G牌照以来,迅速推进网络建设目标,成为5G网络覆盖广、应用场景多、用户体验出色的第四大运营商。其依托全球独有的700MHz频谱资源,具备覆盖能力强、容量足、速率高的优势。通过不断深化和中国移动的共…

Redis开发与运维pdf

链接: Redis开发与运维pdf 提取码: rnj7

Gempy 实现地理位置3D模型的展示以及导出

1. 首先安装python gempy 包 pip install gempy python 版本 3.10 这个很重要,版本不同可能会报错 2. gdal 可能会报错, 一下地址根据python版本下载,然后移入到python解释器环境中, Script文件中,然后cmd ,pip install 文件名安装即可 Releases cgohlke/geospatial-wheels …

μC/OS-II---计时器管理2(os_tmr.c)

目录 获取计时器的名字获取计时器到期前剩余的时间查看计时器的状态 计时器是倒计时器,当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数,在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用(例…