当前位置: 首页 > news >正文

设计模式(单例)

第七天

设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的代码设计的经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

总体来说设计模式分为三大类:

  • 创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

  • 结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

  • 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

1.什么是单例模式

单例模式是创建型模式,它的目的是一个类只有一个实例,并提供一个全局访问点。

使用场景是,频繁创建和销毁对象会使成本较高,使用单例模式可以提高效率。例如日志记录器,数据库连接池。

主要有5种。分别是懒汉、饿汉、静态内部类、双重校验锁以及枚举。

实现思路是那把构造函数private,提供一个全局访问方法,初始化单例对象,并且要保证只能初始化一个单例对象。并且需要考虑线程安全的问题。

饿汉模式

饿汉模式思想是在类刚一初始化的时候就立即把单例对象创建出来,实现方法是,私有构造器,保证其他其他地方不能new对象,利用static代码块只运行一次的特点,来实现只初始化一个单例对象,利用静态方法提供全局访问点。

public class Boss {// 1、设计一个私有的、静态的、当前类的对象private static Boss instance;static {// 对instance静态对象进行实例化instance = new Boss();}// 2、将单例类的构造方法私有化,杜绝从外界通过new的方式实例化对象的可能性。private Boss() {System.out.println("一个Boss对象出现了 "); }
​// 3、需要提供一个public权限的静态方法,可以获取一个当前类的对象。public static Boss getCurrentBoss() {return instance;}
}

懒汉模式

懒汉模式,就是在需要的时候才会去创建对象。现方法是,私有构造器,保证其他其他地方不能new对象,利用static提供全局访问点,并在方法判断是否已经创建过对象,如果创建过就返回已有的来保证只有一个单例对象。

public class Master {
​private static Master instance;private Master() {System.out.println("一个Chairman对象被实例化了 "); }public static Master getMaster() {// 使用到instance对象的时候,判断是不是nullif (instance == null) {// 实例化instance = new Master();}return instance;}
}

静态内部

public class Singleton {  private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton();  }  private Singleton (){}  public static final Singleton getInstance() {  return SingletonHolder.INSTANCE;  }  
}  

枚举

public enum Singleton {  INSTANCE;  public void whateverMethod() {  }  
}  

双重校验锁

public class Singleton {  private volatile static Singleton singleton;  private Singleton (){}  public static Singleton getSingleton() {  if (singleton == null) {  synchronized (Singleton.class) {  if (singleton == null) {  singleton = new Singleton();  }  }  }  return singleton;  }  
​
}  

如何破会单例模式?

想要破坏单例,只要想办法能够执行到这个私有的构造方法就行了。例如反射,反序列化。

如何防止破坏单例模式?

在构造方法上做判断,创建的对象是否为空,使其在反射调用的时候识别出来对象是不是被创建过。

private Singleton() {
​if (singleton != null){      throw new RuntimeException("单例对象只能创建一次... ");
​
}

扩展

工厂模式

主要功能是帮助我们实例化对象,对象实例化过程是通过工厂实现的,工厂代替new操作。有三种:

  1. 简单工厂模式:一个工厂创建多种具体产品

  2. 工厂方法模式:一个工厂方法只创建一个具体产品

  3. 抽象工厂模式:一个工厂方法只创建一类具体产品

单例模式

确保一个类只有一个实例,并提供一个全局访问点,这种模式可以保证对象的唯一性,并方便对象的管理控制和复用。

  1. 实现方式:饿汉式、懒汉式、静态内部类、枚举、双重校验锁

  2. 问题:序列化和反射可能破坏单例模式

  3. 解决方法:定义readResolve()方法,或在构造方法中判断

模板方法模式

  1. 是一种行为设计模式,主要作用是复用代码

  2. 将公共部分定义在一个父类中,将定制部分实现在子类中

  3. 这样子类可以根据需要扩展或重写父类的方法,而不需要改变算法结构

策略模式

是一种行为设计模式,它允许在运行时根据不同情况选择算法的不同实现。它将算法和相应的行为封装在一个独立的类中,使它们可以相互替换,而不会影响客户的使用。与if-else相比:

  1. 更易扩展

  2. 更易读

  3. 提高代码复用性

适配器模式

将类的接口转换成客户端希望的另一个接口,可以使得原本不兼容的类可以协同工作。

http://www.xdnf.cn/news/1171495.html

相关文章:

  • 《从C风格到C++风格:内存管理的进化之路》
  • JavaScript 02 数据类型和运算符数组对象
  • JavaScript 01 JavaScript 是什么
  • AI智能体“上下文工程”实践:来自 Manus 项目的经验总结
  • 大模型后训练——DPO实践
  • 代码随想录算法训练营第二十八天
  • ZLMediaKit 入门
  • 日常随笔-React摘要
  • List和Map的区别
  • Java函数式编程深度解析:从基础到高阶应用
  • Dify-13: 文本生成API端点
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ImageCarousel(图片轮播组件)
  • wed前端简单解析
  • 小鹏汽车视觉算法面试30问全景精解
  • SpringAOP的实现原理和场景
  • 消息推送功能设计指南:精准触达与用户体验的平衡之道
  • 遇到JAVA问题
  • 深度学习的一些疑点整理
  • Linux文件系统深入理解
  • VirtualBox安装提示security安全问题
  • Coze智能体1分钟全自动生成哲学主义解析视频,无需写文案,无需剪辑
  • 性能测试-从0到1搭建性能测试环境Jmeter+Grafana+influxDB+Prometheus+Linux
  • Collection接口的详细介绍以及底层原理——包括数据结构红黑树、二叉树等,从0到彻底掌握Collection只需这篇文章
  • Linux文件系统理解1
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现持械检测(C#代码,UI界面版)
  • 使用qemu命令启动虚拟机
  • linux辅助知识(Shell 脚本编程)
  • 基于卷积神经网络与小波变换的医学图像超分辨率算法复现
  • AWE2026启动:加码AI科技,双展区联动开启产业新格局
  • 【kubernetes】-2 K8S的资源管理