什么是设计模式?

    设计模式是软件工程中解决常见问题的经典方案,它们代表了最佳实践和经验总结。通过使用设计模式,开发者可以创建更加灵活、可维护和可扩展的代码结构。设计模式不是具体的代码实现,而是针对特定问题的通用解决方案模板,需要在特定上下文中适当应用。

设计模式的核心价值在于:

  • 提供经过验证的解决方案

  • 促进代码重用

  • 提高代码可读性和可维护性

  • 促进团队之间的沟通

设计模式分为3类:

  • 创建型模式:关注对象创建机制,增加创建对象的灵活性
  • 结构型模式:关注类和对象的组合,形成更大的结构
  • 行为型模式:关注对象之间的职责分配和通信

创建型模式

单例模式

意图:确保一个类只有一个实例,并提供全局访问点

适用场景

  • 当类只能有一个实例且客户端可从众所周知的访问点访问它时

  • 当唯一实例应通过子类化扩展,且客户端无需修改代码就能使用扩展实例时

实现要点

  • 私有化构造函数

  • 提供静态方法获取实例

  • 考虑多线程环境下的安全性

示例

public class Singleton {//  volatile确保多线程环境下的可见性private static volatile Singleton instance;private Singleton() {// 防止通过反射实例化if (instance != null) {throw new RuntimeException("Use getInstance() method to get the single instance of this class.");}}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

注意事项

  • 单例模式可能隐藏类之间的依赖关系

  • 不利于单元测试

  • 在分布式系统中可能需要调整

工厂方法模式

意图:定义一个创建对象的接口,但让子类决定实例化哪个类

适用场景

  • 当一个类不知道它需要创建哪些具体类的对象时

  • 当一个类希望由其子类指定创建的对象时

结构

  • Product:定义工厂方法创建的对象的接口

  • ConcreteProduct:实现Product接口的具体类

  • Creator:声明工厂方法

  • ConcreteCreator:重写工厂方法以返回ConcreteProduct实例

示例

// 产品接口
interface Button {void render();void onClick();
}// 具体产品 - HTML按钮
class HtmlButton implements Button {@Overridepublic void render() {System.out.println("渲染HTML按钮");}@Overridepublic void onClick() {System.out.println("HTML按钮点击事件");}
}// 具体产品 - Windows按钮
class WindowsButton implements Button {@Overridepublic void render() {System.out.println("渲染Windows按钮");}@Overridepublic void onClick() {System.out.println("Windows按钮点击事件");}
}// 创建者基类
abstract class Dialog {// 工厂方法public abstract Button createButton();public void render() {Button button = createButton();button.render();button.onClick();}
}// 具体创建者 - HTML对话框
class HtmlDialog extends Dialog {@Overridepublic Button createButton() {return new HtmlButton();}
}// 具体创建者 - Windows对话框
class WindowsDialog extends Dialog {@Overridepublic Button createButton() {return new WindowsButton();}
}

抽象工厂模式

意图:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类

适用场景

  • 系统需要独立于其产品的创建、组合和表示时

  • 系统需要配置多个产品系列中的一个时

  • 需要强调一系列相关产品对象的设计以便进行联合使用时

示例

// 抽象产品 - 按钮
interface Button {void paint();
}// 抽象产品 - 复选框
interface Checkbox {void paint();
}// 具体产品 - Mac按钮
class MacOSButton implements Button {@Overridepublic void paint() {System.out.println("绘制MacOS风格按钮");}
}// 具体产品 - Windows按钮
class WindowsButton implements Button {@Overridepublic void paint() {System.out.println("绘制Windows风格按钮");}
}// 具体产品 - Mac复选框
class MacOSCheckbox implements Checkbox {@Overridepublic void paint() {System.out.println("绘制MacOS风格复选框");}
}// 具体产品 - Windows复选框
class WindowsCheckbox implements Checkbox {@Overridepublic void paint() {System.out.println("绘制Windows风格复选框");}
}// 抽象工厂
interface GUIFactory {Button createButton();Checkbox createCheckbox();
}// 具体工厂 - Mac工厂
class MacOSFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacOSButton();}@Overridepublic Checkbox createCheckbox() {return new MacOSCheckbox();}
}// 具体工厂 - Windows工厂
class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic Checkbox createCheckbox() {return new WindowsCheckbox();}
}// 客户端代码
class Application {private Button button;private Checkbox checkbox;public Application(GUIFactory factory) {button = factory.createButton();checkbox = factory.createCheckbox();}public void paint() {button.paint();checkbox.paint();}
}

建造者模式

意图:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示

适用场景

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时

  • 当构造过程必须允许被构造的对象有不同的表示时

示例

// 最终产品
class Car {private String engine;private int seats;private boolean GPS;private boolean tripComputer;// 省略getter和setter方法public void display() {System.out.println("汽车配置:");System.out.println("引擎:" + engine);System.out.println("座位数:" + seats);System.out.println("GPS:" + (GPS ? "有" : "无"));System.out.println("行车电脑:" + (tripComputer ? "有" : "无"));}
}// 抽象建造者
interface CarBuilder {void reset();void setEngine(String engine);void setSeats(int seats);void setGPS(boolean hasGPS);void setTripComputer(boolean hasTripComputer);Car getResult();
}// 具体建造者
class SportsCarBuilder implements CarBuilder {private Car car;public SportsCarBuilder() {this.reset();}@Overridepublic void reset() {this.car = new Car();}@Overridepublic void setEngine(String engine) {car.setEngine(engine);}@Overridepublic void setSeats(int seats) {car.setSeats(seats);}@Overridepublic void setGPS(boolean hasGPS) {car.setGPS(hasGPS);}@Overridepublic void setTripComputer(boolean hasTripComputer) {car.setTripComputer(hasTripComputer);}@Overridepublic Car getResult() {Car product = this.car;this.reset();return product;}
}// 导演类
class Director {public void constructSportsCar(CarBuilder builder) {builder.reset();builder.setEngine("V8引擎");builder.setSeats(2);builder.setGPS(true);builder.setTripComputer(true);}public void constructSUV(CarBuilder builder) {builder.reset();builder.setEngine("V6引擎");builder.setSeats(7);builder.setGPS(true);builder.setTripComputer(false);}
}// 客户端使用
public class BuilderDemo {public static void main(String[] args) {Director director = new Director();CarBuilder builder = new SportsCarBuilder();director.constructSportsCar(builder);Car car = builder.getResult();car.display();}
}

原型模式

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

适用场景

  • 当要实例化的类是在运行时指定时

  • 当需要避免创建与产品类层次平行的工厂类层次时

  • 当一个类的实例只能有几个不同状态组合中的一种时

示例

// 原型接口
interface Prototype {Prototype clone();String getName();void setName(String name);
}// 具体原型
class ConcretePrototype implements Prototype {private String name;public ConcretePrototype(String name) {this.name = name;}@Overridepublic Prototype clone() {return new ConcretePrototype(this.name);}@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name = name;}
}// 客户端使用
public class PrototypeDemo {public static void main(String[] args) {ConcretePrototype original = new ConcretePrototype("原始对象");System.out.println("原始对象名称: " + original.getName());ConcretePrototype cloned = (ConcretePrototype) original.clone();cloned.setName("克隆对象");System.out.println("原始对象名称: " + original.getName());System.out.println("克隆对象名称: " + cloned.getName());}
}

:)

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

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

相关文章

我爱学算法之—— 位运算(上)

常见位运算 对于位运算: &:按位与,有0则0。 |:按位或,有1则1。 ^:按位异或,相同为0、不同为1。(无进位相加) ~:二进制位按位取反。 对于位运算的常见使用…

智能语音系统

智能语音系统通过技术手段让机器能够“听懂”、“理解”并“回应”人类的语音,是实现人机交互的关键技术之一。下面我将为你梳理智能语音系统的核心组成部分、工作原理、应用场景以及面临的挑战。🧠 核心技术与工作原理智能语音系统之所以能实现人机交互…

水泵自动化远程监测与控制的御控物联网解决方案

一、行业背景与痛点分析水泵作为工业生产、农业灌溉、城市供水等领域的核心设备,其运行效率直接影响系统稳定性与运营成本。然而,传统管理模式存在三大核心痛点:人工巡检低效:偏远地区水泵分布分散,依赖人工定期巡检&a…

Python实现点云法向量各种方向设定

本次我们分享点云法向量定向的四种方法,分别是XYZ轴、相机位置、最小生成树(MST)和质心设定方法。通常出现在三维点云处理、三维重建、计算机视觉或图形学中,需要估计点云的法向量方向。它们的核心任务是:在已知点坐标和局部几何结构&#xf…

腾讯云智能体开发平台

提供全球领先的云计算服务腾讯云,腾讯集团倾力打造的云计算品牌,面向全世界各个国家和地区的政府机构、企业组织和个人开发者,提供全球领先的云计算、大数据、人工智能等技术产品与服务,以卓越的科技能力打造丰富的行业解决方案&a…

css flex布局,设置flex-wrap:wrap换行后,如何保证子节点被内容撑高后,每一行的子节点高度一致。

flex布局&#xff0c;设置flex-wrap&#xff1a;wrap换行后&#xff0c;如何保证子节点被内容撑高后&#xff0c;每一行的子节点高度一致。核心&#xff1a;需要设置父节点和子节点&#xff1a;align-items: stretch&#xff0c;两个都要。代码&#xff1a;<div class"…

Nginx_Tomcat综合案例

要求 需求&#xff1a;通过 nginx 来代理两个 tomcat 服务器&#xff08;反向代理&#xff09;&#xff0c;然后通过 https://www.nginx.com 来进行访问。主机名IP软件nginx192.168.30.10nginxtomcat1192.168.30.11java&#xff0c;tomcattomcat2192.168.30.12java&#xff0c;…

【Vue2手录12】单文件组件SFC

一、知识回顾-Vue2项目基础操作与环境配置 1.1 项目启动 项目打开方式&#xff1a;直接将项目文件夹&#xff08;如my-app&#xff09;拖拽到 Visual Studio Code&#xff08;推荐编辑器&#xff09;&#xff0c;避免拖拽父级文件夹&#xff0c;防止路径混乱。启动命令&#xf…

VS2022下载+海康SDK环境配置实现实时预览

一.VS2022下载去官网下载就可以了&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/下载Community版本是免费的。&#xff08;2&#xff09;下载后得安装包VisualStudioSetup.exe打开&#xff1a;点击继续等待下载完成&#xff0c;出现如下界面&#xff0c;这里是选…

YOLO 模型从 PyTorch 转换为 ONNX 并优化

YOLO 模型从 PyTorch 转换为 ONNX 并优化 在深度学习部署中&#xff0c;ONNX&#xff08;Open Neural Network Exchange&#xff09; 已成为跨框架与跨平台的标准格式。我们经常需要将 YOLOv8 在 PyTorch 中训练好的模型转换为 ONNX&#xff0c;并进行优化&#xff0c;以便在 …

推进新型信息基础设施建设发展:蜂窝模组行业迎来结构性机遇

工信部副部长张云明在2025年9月9日国新办新闻发布会上明确表示&#xff0c;将"扎实推进新型信息基础设施建设发展"&#xff0c;并重点强调"打造新型工业网络&#xff0c;推进蜂窝车联网部署" 。这一政策表态对蜂窝模组行业产生深远影响&#xff0c;将推动行…

返利app排行榜的缓存更新策略:基于过期时间与主动更新的混合方案

返利app排行榜的缓存更新策略&#xff1a;基于过期时间与主动更新的混合方案 大家好&#xff0c;我是阿可&#xff0c;微赚淘客系统及省赚客APP创始人&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在返利APP中&#xff0c;“热门商品排行榜”“用…

科技信息差(9.12)

AI量子计算重塑药物研发&#xff1a;技术融合路径与产业革命一、引言&#xff1a;技术融合的颠覆性机遇2025年9月&#xff0c;AI药物研发公共服务平台正式上线&#xff0c;宣称可将新药上市时间缩短近半1。与此同时&#xff0c;量子计算与AI的跨界合作在KRAS抑制剂开发中取得突…

Java 分布式缓存实现:结合 RMI 与本地文件缓存

目录 一、核心思路 二、项目结构说明 2.1 服务端项目结构&#xff08;IDEA&#xff09; 2.2 客户端项目结构&#xff08;Eclipse&#xff09; 三、服务端实现&#xff08;IDEA&#xff09; 3.1 数据库访问层 3.2 远程接口定义 3.3 远程服务实现 3.4 服务端启动类 四、…

Electron第一个应用

1、安装node nodeJS下载 2、下载完成&#xff0c;需要配置环境。 写道path路径 、 3、安装完成&#xff0c;查看版本 npm -v4、 配置cnpm npm install -g cnpm --registryhttps://registry.npmmirror.com5、参考Electron 写&#xff1a; Electron第一个程序hello 6、安装…

React 原理篇 - React 新架构深度解析

使用过 React v16 之前版本的开发者或许都经历过这样的场景&#xff1a;当页面包含复杂组件或大量列表时&#xff0c;输入框打字会卡顿&#xff0c;滚动会不流畅。这些体验问题的背后&#xff0c;往往与 React 的渲染机制密切相关。2017 年 React v16 推出的 Fiber 架构&#x…

【JavaSE五天速通|第三篇】常用API与日期类篇

适合有其他语言基础想快速入门JavaSE的。用的资料是 Java入门基础视频教程 &#xff0c;从中摘取了笔者认为与其他语言不同或需要重点学习的内容 常用API与日期类只需要有印象即可&#xff0c;用到了再来这查 day04 常用API 一、StringBuilder类 StringBuilder代表可变字符…

K8s学习笔记(二) Pod入门与实战

1 K8s核心资源Pod 1.1 Pod是什么&#xff1f; 官方文档&#xff1a;Pod | Kubernetes Pod 是 Kubernetes&#xff08;k8s&#xff09;中最小的部署与调度单元&#xff0c;并非直接运行容器&#xff0c;而是对一个或多个 “紧密关联” 容器的封装。 核心特点可简单总结为 3 …

用 Python 调用 Bright Data MCP Server:在 VS Code 中实现实时网页数据抓取

用 Python 调用 Bright Data MCP Server&#xff1a;在 VS Code 中实现实时网页数据抓取&#xff0c;本文介绍了Bright Data的Web MCP Server&#xff0c;这是一款能实现实时、结构化网页数据访问的API&#xff0c;适用于AI应用等场景。其支持静态与动态网页&#xff0c;前3个月…

SPSS绘制ROC曲线并计算灵敏度、特异度

SPSS绘制ROC曲线并计算灵敏度、特异度。 &#xff08;1&#xff09;绘制ROC曲线&#xff1a; 输入&#xff1a;预测值、受试者标签。 在SPSS中点击“分析”-“分类”-“ROC曲线” 变量输入&#xff1a;检验变量输入预测值&#xff0c;状态变量输入受试者标签&#xff0c;如果标…