设计模式1:创建型模式
设计模式2:结构型模式(编写中)
设计模式3:行为型模式(编写中)

前言

设计模式是软件开发中经过验证的可复用解决方案,它们源自实践、提炼于经验,并在面向对象编程中扮演着关键角色。GoF(Gang of Four)设计模式分为创建型结构型行为型三大类,共23种。设计模式的核心价值在于提高代码的可维护性、可扩展性和可复用性,同时遵循软件设计原则。
本文介绍创建型模式。创建型模式关注对象的创建过程,通过将对象的创建与使用分离,使系统能够灵活地控制对象的生成方式。

1 单例模式(Singleton)

单例模式确保一个类只有一个实例,并提供一个全局访问点。它适用于需要严格控制实例数量的场景,如全局配置、数据库连接池和日志系统等。
核心思想:通过私有构造函数限制外部实例化,使用静态变量保存唯一实例,并通过静态方法提供全局访问。
Java实现:

public class President {private static President instance; // 唯一private President() {} // 禁止外部newpublic static President getInstance() { if (instance == null) {  instance = new President(); // 延迟初始化  }  return instance; } 
}// 使用示例 
President p1 = President.getInstance(); 
President p2 = President.getInstance(); 
System.out.println(p1 == p2); // true(同一个) 

适用场景:需要全局唯一访问点的场景,如配置管理、资源共享等。
优点:节省内存,避免重复创建;提供全局访问点。
缺点:多线程环境下需加锁(可用双重检查锁优化);破坏了单一职责原则。

2 工厂方法模式(Factory Method)

工厂方法模式定义一个创建对象的接口,但由子类决定实例化哪一个类,将实例化延迟到子类。它适用于需要解耦对象创建与使用,同时允许扩展的场景。
核心思想:通过抽象工厂类定义创建对象的方法,具体实现由子类完成,遵循开闭原则。
Java实现:

// 抽象产品类 
interface Transport {  void deliver(); 
}
// 具体产品类 
class Truck implements Transport {  public void deliver() {  System.out.println(“陆运”);  } 
}
class Ship implements Transport {  public void deliver() {  System.out.println(“海运”);  } 
}
// 抽象工厂类 
interface Logistics {  Transport createTransport(); 
}
// 具体工厂类 
class RoadLogistics implements Logistics {  public Transport createTransport() {  return new Truck();  } 
}
class SeaLogistics implements Logistics {  public Transport createTransport() {  return new Ship();  }
}// 使用示例 
Logistics roadLogistics = new RoadLogistics(); 
Transport truck = roadLogistics.createTransport(); 
truck.deliver(); 

适用场景:对象创建逻辑复杂(如依赖配置、外部服务),需解耦对象创建与使用 。
优点:扩展性强,新增产品只需添加子类;遵循开闭原则。
缺点:每新增一个产品就要新增一个工厂类;类层次结构可能变得复杂。

3 抽象工厂模式(Abstract Factory)

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。它适用于需要创建多个相关对象家族的场景。
核心思想:通过工厂接口定义一组产品对象的创建方法,具体实现由子类完成,实现产品家族的统一创建。
Java实现:

// 产品接口 
interface Phone {  void call(); 
}
interface Earphone {  void play(); 
}
// 苹果产品家族 
class iPhone implements Phone {  public void call() {  System.out.println(“iPhone通话”);  } 
}
class AirPods implements Earphone {  public void play() {  System.out.println(AirPods播放”);  } 
}
// 小米产品家族 
class MiPhone implements Phone {  public void call() {  System.out.println(“小米手机通话”);  } 
}
class MiEarphone implements Earphone {  public void play() {  System.out.println(“小米耳机播放”);  } 
}
// 抽象工厂接口 
interface TechFactory {  Phone createPhone();  Earphone createEarphone(); 
}
// 具体工厂类 
class AppleFactory implements TechFactory {  public Phone createPhone() {  return new iPhone();  }public Earphone createEarphone() {  return new AirPods();  } 
}
class MiFactory implements TechFactory {  public Phone createPhone() {  return new MiPhone();  }public Earphone createEarphone() {  return new MiEarphone();  } 
}// 使用示例 
TechFactory factory = new AppleFactory(); 
Phone phone = factory.createPhone(); 
Earphone earphone = factory.createEarphone();
phone.call(); // iPhone通话 
earphone.play(); // AirPods播放 

适用场景:跨平台应用(如Windows/macOS按钮)、产品线扩展等。
优点:产品族统一创建,保证一致性;扩展性强,新增产品族只需添加子类。
缺点:工厂类数量随产品族增加而增加;难以支持产品族的动态切换。

4 建造者模式(Builder)

建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它适用于需要构建复杂对象,且对象的构建过程可能变化的场景。
核心思想:通过建造者类逐步构建对象,最后通过build方法返回完整对象;使用导演类控制构建过程。
Java实现:

// 奶茶产品类 
class BubbleTea {  private String size;  private boolean ice;  private List toppings;// 私有构造函数  private BubbleTea(Builder builder) {  this.size = builder.size;  this.ice = builder.ice;  this.toppings = builder.toppings;  }// 获取建造者  public static class Builder {  private String size = “中杯”;  private boolean ice = true;  private List toppings = new ArrayList<>();public Builder size(String size) {  this.size = size;  return this;  }public Builder ice(boolean ice) {  this.ice = ice;  return this;  }public Builder addTopping(Topping topping) {  toppings.add(topping);  return this;  }public BubbleTea build() {  return new BubbleTea(this);  }  }// 配料枚举  enum Topping {  波霸, 珍珠, 椰果, 西米  } 
}// 使用示例 
BubbleTea bubbleTea = new BubbleTea.Builder()  .size(“大杯”)  .ice(false)  .addTopping(BubbleTea.Topping.波霸)  .addTopping(BubbleTea.Topping.珍珠)  .build();
System.out.println(“奶茶规格:” + bubbleTea.size); 
System.out.println(“是否加冰:” + (bubbleTea.ice ? “是” : “否”)); 
System.out.println(“配料:” + bubbleTea.toppings); 

适用场景:构建复杂对象(如订单、配置文件)、参数较多的构造函数等。
优点:参数解耦,构建过程清晰;支持部分构建和链式调用。
缺点:类数量增加;过度使用可能增加代码复杂度。

5 原型模式(Prototype)

原型模式通过复制现有对象来创建新对象,避免重复初始化。它适用于对象创建成本高,或需要快速复制已有对象的场景。
核心思想:通过克隆方法复制对象,创建新实例;使用深拷贝或浅拷贝控制复制深度。
Java实现:

// 原型接口 
interface Shape extends Cloneable {  void draw();  Shape clone(); 
}
// 具体形状类 
class Circle implements Shape {  private String color;public Circle(String color) {  this.color = color;  }public void draw() {  System.out.println(“绘制圆形,颜色:” + color);  }@Override  public Shape clone() {  try {  return (Shape) super.clone();  } catch (CloneException e) {  throw new RuntimeException(e);  }  } 
}
class Square implements Shape {  private int sideLength;public Square(int sideLength) {  this.sideLength = sideLength;  }public void draw() {  System.out.println(“绘制正方形,边长:” + sideLength);  }@Override  public Shape clone() {  try {  return (Shape) super.clone();  } catch (CloneException e) {  throw new RuntimeException(e);  }  } 
}// 使用示例 
Circle circle = new Circle(“红色”); 
Shape circleClone = circle.clone();
circleClone.draw(); // 绘制圆形,颜色:红色

适用场景:对象创建成本高(如数据库连接、图形对象)、需要快速复制已有对象等 [3]。
优点:性能高效,避免重复初始化;代码简洁,直接使用克隆方法 [3]。
缺点:深拷贝实现复杂;不适合不可克隆的对象。

6 对象池模式(Object Pool)

对象池模式是单例模式的扩展,通过预先创建并管理对象集合,减少频繁创建/销毁的开销 。它适用于资源密集型对象(如数据库连接、网络套接字)的高效复用场景。
核心思想:通过对象池管理对象的生命周期,包括对象的分配、重用和释放;使用工厂模式创建和销毁对象 。
Java实现:

// 池化对象接口 
interface PoolableObject {  void activate(); // 激活对象  void passivate(); // 使对象空闲 
}
// 对象池接口 
interface ObjectPool {     T borrowObject();  // 获取对象     void returnObject(T obj);  // 归还对象     void clear();      // 清除池中对象 
}
// 对象池工厂接口 
interface PoolableObjectFactory {     T makeObject();     // 创建对象     void destroyObject(T obj);  // 销毁对象     void activateObject(T obj);  // 激活对象     void passivateObject(T obj);  // 使对象空闲 
}
// 具体实现 
class SimpleObjectPool implements ObjectPool {private final PoolableObjectFactory factory;     private final List pool = new ArrayList<>();     private final int maxPoolSize;public SimpleObjectPool(PoolableObjectFactory factory, int maxPoolSize) {         this.factory = factory;         this.maxPoolSize = maxPoolSize;         // 初始化池         for (int i = 0; i < maxPoolSize; i++) {             T obj = factory.makeObject();             obj.passivate();             pool.add(obj);        }     }@Override  public T borrowObject() {  // 获取空闲对象  for (T obj : pool) {  if (!obj.isActive()) {  obj.activate();  return obj;  }}  // 如果池已满,可能需要创建新对象  if (pool.size() < maxPoolSize) {  T obj = factory.makeObject();  obj.activate();  pool.add(obj);  return obj;  }  // 池已满,无法获取对象  return null;  }@Override  public void returnObject(T obj) {  if (pool.contains(obj)) {  obj.passivate();  } else {  // 可能需要处理不属于池的对象  factory.destroyObject(obj);  }  }@Override  public void clear() {  for (T obj : pool) {  factory.destroyObject(obj);  }  pool.clear();  } 
}
// 使用示例 
// 定义池化对象 
class DatabaseConnection implements PoolableObject {  private boolean active = false;public void activate() {  this.active = true;  System.out.println(“连接激活”);  }public void passivate() {  this.active = false;  System.out.println(“连接空闲”);  }public boolean.isActive() {  return active;  }public void connect() {  System.out.println(“建立数据库连接”);  }public void disconnect() {  System.out.println(“关闭数据库连接”);  } 
}
// 定义工厂 
class DatabaseConnectionFactory implements PoolableObjectFactory {     @Override     public DatabaseConnection makeObject() {         return new DatabaseConnection();     }@Override  public void destroyObject(DatabaseConnection obj) {  obj.disconnect();  }@Override  public void activateObject(DatabaseConnection obj) {  obj.activate();  }@Override  public void passivateObject(DatabaseConnection obj) {  obj.passivate();  } 
}
// 使用对象池 
ObjectPool pool = new SimpleObjectPool<>(new DatabaseConnectionFactory(), 10);
DatabaseConnection conn = pool borrowObject(); 
// 使用连接 
conn.connect(); 
// 归还连接 
pool.returnObject(conn); 

适用场景:资源密集型对象(如数据库连接、网络套接字、游戏中的粒子系统)的高效复用。
优点:减少对象创建和销毁的开销;提高系统性能。
缺点:增加系统复杂度;管理池对象需要额外资源。

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

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

相关文章

React--》规划React组件库编码规范与标准 — Button篇

目前前端组件化已经成为前端开发的核心思想之一&#xff0c;在这篇文章中将深入探讨如何规划一个规范的Button组件&#xff0c;让它不仅能高效支持不同的功能需求还能确保跨项目、跨团队的一致性&#xff0c;抛砖引玉的方式引出后面组件库的其他组件的开发&#xff01; 目录 B…

中科米堆CASAIM金属件自动3d测量外观尺寸三维检测解决方案

金属零部件的外观尺寸检测直接关系到产品的装配精度和使用性能。CASAIM基于激光扫描技术的自动化三维扫描系统&#xff0c;为金属加工行业提供了高效的自动3D测量解决方案&#xff0c;有效解决了传统检测方式效率低、覆盖面有限等问题。激光扫描技术在金属件测量中优势明显。与…

开源数据同步中间件,支持MySQL、Oracle

DBSyncer&#xff08;英[dbsɪŋkɜː(r)]&#xff0c;美[dbsɪŋkɜː(r) 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务&#xff0…

中英混合的语音识别XPhoneBERT 监督的音频到音素的编码器结合 f0 特征LID

完整项目包获取点击文末名片完成一个 Code-Switching&#xff08;中英混合&#xff09;的语音识别系统&#xff0c;整个流程如下思路进行&#xff1a; 163. (Step 1) 训练音频到音素的编码器&#xff08;Audio → Phoneme Encoder&#xff09; 你已经完成了此部分。核心思路是利…

Param关键字的使用

1&#xff1a;当一个方法的某一个参数个数不固定的时候&#xff0c;可以使用Param2:可变的方法参数必须定义为数组类型3&#xff1a;该参数必须放在方法参数的最后&#xff0c;应且只有一个4&#xff1a;参数必须为一维数组5&#xff1a;params不能和ref和out组合使用namespace…

京东云轻量云服务器与腾讯云域名结合配置网站及申请SSL证书流程详解

京东云轻量云服务器与腾讯云域名结合配置网站及申请SSL证书流程详解 1. 需求及实现效果 1.1. 需求 先说一下我当前情况&#xff0c;我目前有一个京东云服务器和一个在腾讯云旗下买的域名&#xff08;不要问为啥一个在京东云&#xff0c;一个在腾讯云&#xff0c;那自然是哪个…

Python入门Day14:面向对象编程初步(OOP入门)

学习目标&#xff1a;理解面向对象编程&#xff08;OOP&#xff09;的基本思想&#xff1a;类&#xff0c;对象掌握类的定义&#xff0c;构造方法&#xff0c;实例属性和方法熟悉self的含义与作用学会用类组织和封装代码&#xff0c;初步构建自己的“对象世界”一、什么是面向对…

日志和指标标签规范化方案

好的&#xff0c;设计一个有效的日志和指标标签规范化方案对于构建可观测性强、易于维护、关联分析顺畅的系统至关重要。混乱的标签命名会极大增加查询、聚合、告警和故障排除的难度。 以下是一个综合性的标签规范化方案建议&#xff0c;结合了行业最佳实践&#xff1a; 核心目…

Windows和Linux的tree工具

目录 1.前言 2.Linux的tree工具 2.1.安装tree 2.2.常用命令与参数 2.3.常见应用场景 2.4.注意事项 3.Windows的tree工具 3.1.基础语法 3.2.核心参数详解 3.3.常见应用场景 3.4.局限性与增强方案 4.Windows 与 Linux tree 的核心差异 5.tree工具优势 5.总结 相关…

[echarts] 更新数据

option {title: { text: 销售数据 },tooltip: { trigger: axis },legend: { data: [销量, 库存] },xAxis: {type: category,data: [衬衫, 羊毛衫, 雪纺衫]},yAxis: { type: value },series: [{ name: 销量, type: bar, data: [5, 20, 36] },{ name: 库存, type: line, data: […

通过el-image实现点击文字查看图片,及其图片列表

场景一&#xff1a;表格中有时候会有点击文字查看图片的功能&#xff08;因为表格的一个单元格不方便显示多个图片&#xff09;如下图所示&#xff1a;对于这个需求&#xff0c;我们可以应对的方案是&#xff1a;在文字旁边写一个el-image图默认显示多张图片中的第一张&#xf…

003 实习(前端jquery之轮播图,学校网页)

web前端,查询官网:w3schoolHTML:负责网页结构&#xff08;页面元素和内容&#xff09;CSS:负责网页的表现&#xff08;网页元素的外观、位置等页面样式&#xff0c;如颜色&#xff0c;大小&#xff09;JAVAScript:负责网页的行为&#xff08;交互效果&#xff09;<a>:超链…

Mysql group by

临时表与内存表 内存表是 Memory 引擎表&#xff0c;表的数据行都在内存。 临时表可以使用各种引擎。 临时表是线程私有表&#xff0c;其他线程不可见&#xff0c;不需考虑重名问题。 session 结束时临时表会被自动删除。 如果 Binlog_format row&#xff0c;则临时表语句不进…

Linux(15)——进程间通信

目录 一、进程间通信的介绍 ✍️进程间通信的目的 ✍️进程间通信的本质 进程间通信的分类 ✍️管道 ✍️System V IPC ✍️POSIX IPC 二、管道 &#x1f9e0;什么是管道 ✍️匿名管道 &#x1f4dd;匿名管道的原理 &#x1f4dd;pipe函数 &#x1f4dd;匿名管道…

【Flutter】双路视频播放方案

最近在做双路视频播放&#xff0c;就是在一个页面播放两个视频。我遇到的问题就是音频焦点冲突问题&#xff0c;在下面说明。什么是双路视频播放&#xff08;来自AI&#xff09;双路视频播放&#xff08;Dual-Video Playback&#xff09;&#xff0c;从字面上理解&#xff0c;就…

笔试——Day25

文章目录第一题题目思路代码第二题题目&#xff1a;思路代码第三题题目&#xff1a;思路代码第一题 题目 笨小猴 思路 模拟 统计每个字符出现的次数&#xff0c;用最大减最小&#xff0c;判断是不是质数&#xff1b; 质数的判断使用试除法&#xff1b; 代码 第二题 题目&…

【C#学习Day15笔记】拆箱装箱、 Equals与== 、文件读取IO

前言在C#第15天的学习中&#xff0c;我深入探索了类型转换机制、对象比较原理和文件操作技术三大核心主题。这些知识是构建高效、健壮程序的关键基础。本文完整保留我的课堂实践代码和命名体系&#xff0c;通过结构化梳理帮助大家掌握这些核心概念。所有代码示例均来自我的实际…

发电类电力业务许可证申请条件

基本条件&#xff1a;法人资格&#xff1a;申请人必须是依法注册的企业法人。 财务能力&#xff1a;应具有与所申请从事的电力业务相适应的财务能力。 专业人员要求&#xff1a;生产运行负责人、技术负责人、安全负责人和财务负责人需具备至少3年以上与申请从事的电力业务相关的…

JavaScript 高效入门指南:从基础到实战(VSCode 版)

废话不多说&#xff0c;直接上干货&#x1f600; 一、先搞定工具&#xff1a;VSCode 配置成「JS 开发神器」 工欲善其事&#xff0c;必先利其器。用 VSCode 写 JavaScript&#xff0c;这几个配置能让你效率翻倍&#xff1a; 1. 必装插件&#xff08;直接在 VSCode 插件商店搜…

《人形机器人的觉醒:技术革命与碳基未来》——类人关节设计:柔性驱动革命之液压人工肌肉

目录&#xff1a;一、人工肌肉的种类及人形机器人适用情况二、人形机器人用人工肌肉科研机构及其最新成果进展三、液压人工肌肉种类及工作机制四、液压人工肌肉适用人形机器人的性能要求和局限性五、液压人工肌肉材料技术进展及其限制与突破六、波士顿动力Spot的液压静液传动系…