当前位置: 首页 > 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://unfading .pzdurr.cn
http://ligniferous .pzdurr.cn
http://alcyonarian .pzdurr.cn
http://lest .pzdurr.cn
http://wherethrough .pzdurr.cn
http://hitlerism .pzdurr.cn
http://conceitedly .pzdurr.cn
http://salford .pzdurr.cn
http://improvident .pzdurr.cn
http://faa .pzdurr.cn
http://magnetize .pzdurr.cn
http://ratification .pzdurr.cn
http://addlehead .pzdurr.cn
http://ventrolateral .pzdurr.cn
http://rutter .pzdurr.cn
http://abreaction .pzdurr.cn
http://encina .pzdurr.cn
http://vugular .pzdurr.cn
http://aerobacter .pzdurr.cn
http://casuistics .pzdurr.cn
http://hotbrained .pzdurr.cn
http://limoges .pzdurr.cn
http://hymen .pzdurr.cn
http://reagent .pzdurr.cn
http://colorific .pzdurr.cn
http://helicab .pzdurr.cn
http://disparlure .pzdurr.cn
http://muley .pzdurr.cn
http://guevarist .pzdurr.cn
http://anyhow .pzdurr.cn
http://www.dtcms.com/a/293938.html

相关文章:

  • 界面组件DevExpress WPF中文教程:Grid - 如何过滤节点?
  • Linux下SVN常用指令
  • 设计模式代码总结
  • Android MediaCodec 的使用和源码实现分析
  • 路由器与交换机的区别
  • 从入门到精通:Windows右键菜单管理全解析
  • 为什么 Linux 启动后还能升级内核?
  • Jmeter的函数助手使用
  • 基于Dapr Sidecar的微服务通信框架设计与性能优化实践
  • 【软件系统架构】系列七:物联网云平台系统性能深入解析
  • HTTP性能优化终极指南:从协议原理到企业级实践
  • 视频、音频录制
  • 操作系统:系统调用的分类(Types of System Calls)
  • C++ 扫描局域网某个端口是否开放(如 5555 )(android adb) 线程并发加速
  • 3d移动translate3d
  • 秋招Day17 - Spring - Spring Boot
  • 【图像处理基石】如何实现一个车辆检测算法?
  • Nginx和Apache的区别
  • 多维任务筛选工具功能解析:如何通过智能筛选功能精准对接任务需求?
  • There are 2 missing blocks. The following files may be corrupted
  • 亚马逊AI新项目Starfish:重构电商Listing生态的机遇与挑战
  • 西班牙智能警示灯法案:引领欧洲智能交通新趋势
  • 0.0 深度学习资料网站
  • 工业控制系统的现状与发展趋
  • 分享一个tauri-plugin-http的工具类
  • python3写一个异步流式 http 接口服务调用大模型(async, stream, sanic)---6.2
  • 基于数据挖掘的短视频点赞影响因素分析【LightGBM、XGBoost、随机森林、smote】
  • 探索大语言模型(LLM):提升 RAG 性能的全方位优化策略
  • 深圳TCL外包岗位要去吗?
  • NLP基础全面解析:从概念到实践