单例模式(Singleton)- 最易懂的设计模式解析

【Unity技巧】使用单例模式Singleton 这几天想把在实习里碰到的一些好的技巧写在这里,也算是对实习的一个总结。好啦,今天要讲的是在Unity里应用一种非常有名的设计模式——单例模式。 阅读详情

1. 引入

1.1 解决的是什么问题
含义:单例 =一个实例
解决的问题:降低对象之间的耦合度
解决方法:实现一个类只有一个实例化对象,并提供一个全局访问点
即,单例模式
这里写图片描述
1.2 实例引入
接下来我用一个实例来对单例模式进行引入

背景:小成有一个塑料生产厂,但里面只有一个仓库。
目的:想用代码来实现仓库的管理
现有做法: 建立仓库类和工人类
其中,仓库类里的quantity=商品数量;工人类里有搬运方法MoveIn(int i)和MoveOut(int i)。

出现的问题:通过测试发现,每次工人搬运操作都会新建一个仓库,就是货物都不是放在同一仓库,这是怎么回事呢?(看下面代码)

//仓库类
class StoreHouse {
    private int quantity = 100;

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int getQuantity() {
        return quantity;
    }
}

//搬货工人类
class Carrier{
    public StoreHouse mStoreHouse;
    public Carrier(StoreHouse storeHouse){
        mStoreHouse = storeHouse;
    }
    //搬货进仓库
    public void MoveIn(int i){
        mStoreHouse.setQuantity(mStoreHouse.getQuantity()+i);
    }
    //搬货出仓库
    public void MoveOut(int i){
        mStoreHouse.setQuantity(mStoreHouse.getQuantity()-i);
    }
}

//工人搬运测试
public class SinglePattern {
    public static void main(String[] args){
        StoreHouse mStoreHouse1 = new StoreHouse();
        StoreHouse mStoreHouse2 = new StoreHouse();
        Carrier Carrier1 = new Carrier(mStoreHouse1);
        Carrier Carrier2 = new Carrier(mStoreHouse2);

        System.out.println("两个是不是同一个?");

        if(mStoreHouse1.equals(mStoreHouse2)){//这里用equals而不是用 == 符号,因为 == 符号只是比较两个对象的地址
            System.out.println("是同一个");
        }else {
            System.out.println("不是同一个");
        }
        //搬运工搬完货物之后出来汇报仓库商品数量
        Carrier1.MoveIn(30);
        System.out.println("仓库商品余量:"+Carrier1.mStoreHouse.getQuantity());
        Carrier2.MoveOut(50);
        System.out.println("仓库商品余量:"+Carrier2.mStoreHouse.getQuantity());
    }
}

结果:

两个是不是同一个?
不是同一个
仓库商品余量:130
仓库商品余量:50
这里写代码片
  1. 单例模式介绍
    2.1 解决的问题(应用场景)
    冲突:从上面的结果可以看出,工人类操作的明显不是同一个仓库实例
    目标:全部工人操作的是同一个仓库实例
    单例模式就是为了解决这类问题的解决方案:实现一个类只有一个实例化对象,并提供一个全局访问点
    2.2 工作原理
    在Java中,我们通过使用对象(类实例化后)来操作这些类,类实例化是通过它的构造方法进行的,要是想实现一个类只有一个实例化对象,就要对类的构造方法下功夫:
    这里写图片描述

public class Singleton {
//1. 创建私有变量 ourInstance(用以记录 Singleton 的唯一实例)
//2. 内部进行实例化
    private static Singleton ourInstance  = new  Singleton();

//3. 把类的构造方法私有化,不让外部调用构造方法实例化
    private Singleton() {
    }
//4. 定义公有方法提供该类的全局唯一访问点
//5. 外部通过调用getInstance()方法来返回唯一的实例
    public static  Singleton newInstance() {
        return ourInstance;
    }
}

好了,单例模式的介绍和原理应该了解了吧?那么我们现在来解决上面小成出现的“仓库不是一个”的问题吧!

2.3 实例介绍
小成使用单例模式改善上面例子的代码:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//单例仓库类
class StoreHouse {

    //仓库商品数量
    private int quantity = 100;
    //自己在内部实例化
    private static StoreHouse ourInstance  = new StoreHouse();;
    //让外部通过调用getInstance()方法来返回唯一的实例。
    public static StoreHouse getInstance() {
        return ourInstance;
    }

    //封闭构造函数
    private StoreHouse() {
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int getQuantity() {
        return quantity;
    }
}


//搬货工人类
class Carrier{
    public StoreHouse mStoreHouse;
    public Carrier(StoreHouse storeHouse){
        mStoreHouse = storeHouse;
    }
    //搬货进仓库
    public void MoveIn(int i){
        mStoreHouse.setQuantity(mStoreHouse.getQuantity()+i);
    }
    //搬货出仓库
    public void MoveOut(int i){
        mStoreHouse.setQuantity(mStoreHouse.getQuantity()-i);
    }
}

//工人搬运测试
public class SinglePattern {
    public static void main(String[] args){
        StoreHouse mStoreHouse1 = StoreHouse.getInstance();
        StoreHouse mStoreHouse2 = StoreHouse.getInstance();
        Carrier Carrier1 = new Carrier(mStoreHouse1);
        Carrier Carrier2 = new Carrier(mStoreHouse2);

        System.out.println("两个是不是同一个?");

        if(mStoreHouse1.equals(mStoreHouse2)){
            System.out.println("是同一个");
        }else {
            System.out.println("不是同一个");
        }
        //搬运工搬完货物之后出来汇报仓库商品数量
        Carrier1.MoveIn(30);
        System.out.println("仓库商品余量:"+Carrier1.mStoreHouse.getQuantity());
        Carrier2.MoveOut(50);
        System.out.println("仓库商品余量:"+Carrier2.mStoreHouse.getQuantity());
    }
}

结果:

两个是不是同一个?
是同一个
仓库商品余量:130
仓库商品余量:80

从结果分析,使用了单例模式后,仓库类就只有一个仓库实例了,再也不用担心搬运工人进错仓库了!!!

2.4 优点
提供了对唯一实例的受控访问;
由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能;
可以根据实际情况需要,在单例模式的基础上扩展做出双例模式,多例模式;
2.5 缺点
单例类的职责过重,里面的代码可能会过于复杂,在一定程度上违背了“单一职责原则”。
如果实例化的对象长时间不被利用,会被系统认为是垃圾而被回收,这将导致对象状态的丢失。

3. 单例模式的实现方式

单例模式的实现方式有多种,根据需求场景,可分为2大类、6种实现方式。具体如下:
这里写图片描述
下面,我将详细介绍每种单例模式的实现方式
a. 初始化单例类时 即 创建单例
1. 饿汉式

这是 最简单的单例实现方式

原理
依赖 JVM类加载机制,保证单例只会被创建1次,即 线程安全

JVM在类的初始化阶段(即 在Class被加载后、被线程使用前),会执行类的初始化
在执行类的初始化期间,JVM会去获取一个锁。这个锁可以同步多个线程对同一个类的初始化

具体实现

class Singleton {

    // 1. 加载该类时,单例就会自动被创建
    private static  Singleton ourInstance  = new  Singleton();

    // 2. 构造函数 设置为 私有权限
    // 原因:禁止他人创建实例 
    private Singleton() {
    }

    // 3. 通过调用静态方法获得创建的单例
    public static  Singleton newInstance() {
        return ourInstance;
    }
}

应用场景
除了初始化单例类时 即 创建单例外,继续延伸出来的是:单例对象 要求初始化速度快 & 占用内存小
2. 枚举类型
原理
根据枚举类型的下述特点,满足单例模式所需的 创建单例、线程安全、实现简洁的需求

public enum Singleton{

    //定义1个枚举的元素,即为单例类的1个实例
    INSTANCE;

    // 隐藏了1个空的、私有的 构造方法
    // private Singleton () {}

}

// 获取单例的方式:
Singleton singleton = Singleton.INSTANCE;

b. 按需、延迟创建单例
1. 懒汉式(基础实现)
原理
与 饿汉式 最大的区别是:单例创建的时机

饿汉式:单例创建时机不可控,即类加载时 自动创建 单例
懒汉式:单例创建时机可控,即有需要时,才 手动创建 单例

具体实现
class Singleton {
// 1. 类加载时,先不自动创建单例
// 即,将单例的引用先赋值为 Null
private static Singleton ourInstance = null;

// 2. 构造函数 设置为 私有权限
// 原因:禁止他人创建实例 
private Singleton() {
}

// 3. 需要时才手动调用 newInstance() 创建 单例   
public static  Singleton newInstance() {
// 先判断单例是否为空,以避免重复创建
if( ourInstance == null){
    ourInstance = new Singleton();
    }
    return ourInstance;
}

}
缺点
基础实现的懒汉式是线程不安全的,具体原因如下
这里写图片描述

下面,将对懒汉式 进行优化,使得适合在多线程环境下运行
2. 同步锁(懒汉式的改进)
原理
使用同步锁 synchronized锁住 创建单例的方法 ,防止多个线程同时调用,从而避免造成单例被多次创建

即,getInstance()方法块只能运行在1个线程中
若该段代码已在1个线程中运行,另外1个线程试图运行该块代码,则 会被阻塞而一直等待
而在这个线程安全的方法里我们实现了单例的创建,保证了多线程模式下 单例对象的唯一性

具体实现

// 写法1
class Singleton {
    // 1. 类加载时,先不自动创建单例
    //  即,将单例的引用先赋值为 Null
    private static  Singleton ourInstance  = null;

    // 2. 构造函数 设置为 私有权限
    // 原因:禁止他人创建实例 
    private Singleton() {
    }

// 3. 加入同步锁
public static synchronized Singleton getInstance(){
        // 先判断单例是否为空,以避免重复创建
        if ( ourInstance == null )
            ourInstance = new Singleton();
        return ourInstance;
    }
}


// 写法2
// 该写法的作用与上述写法作用相同,只是写法有所区别
class Singleton{ 

    private static Singleton instance = null;

    private Singleton(){
}

    public static Singleton getInstance(){
        // 加入同步锁
        synchronized(Singleton.class) {
            if (instance == null)
                instance = new Singleton();
        }
        return instance;
    }
}

缺点
每次访问都要进行线程同步(即 调用synchronized锁),造成过多的同步开销(加锁 = 耗时、耗能)
实际上只需在第1次调用该方法时才需要同步,一旦单例创建成功后,就没必要进行同步

  1. 双重校验锁(懒汉式的改进)
    原理
    在同步锁的基础上,添加1层 if判断:若单例已创建,则不需再执行加锁操作就可获取实例,从而提高性能

具体实现

class Singleton {
    private static  Singleton ourInstance  = null;

    private Singleton() {
    }

    public static  Singleton newInstance() {
     // 加入双重校验锁
    // 校验锁1:第1个if
    if( ourInstance == null){  // ①
     synchronized (Singleton.class){ // ②
      // 校验锁2:第2个 if
      if( ourInstance == null){
          ourInstance = new Singleton();
          }
      }
  }
        return ourInstance;
   }
}

// 说明
// 校验锁1:第1个if
// 作用:若单例已创建,则直接返回已创建的单例,无需再执行加锁操作
// 即直接跳到执行 return ourInstance

// 校验锁2:第2个 if 
// 作用:防止多次创建单例问题
// 原理
  // 1. 线程A调用newInstance(),当运行到②位置时,此时线程B也调用了newInstance()
  // 2. 因线程A并没有执行instance = new Singleton();,此时instance仍为空,因此线程B能突破第1层 if 判断,运行到①位置等待synchronized中的A线程执行完毕
  // 3. 当线程A释放同步锁时,单例已创建,即instance已非空
  // 4. 此时线程B 从①开始执行到位置②。此时第2层 if 判断 = 为空(单例已创建),因此也不会创建多余的实例

缺点
实现复杂 = 多种判断,易出错
4. 静态内部类
原理
根据 静态内部类 的特性,同时解决了按需加载、线程安全的问题,同时实现简洁

在静态内部类里创建单例,在装载该内部类时才会去创建单例
线程安全:类是由 JVM加载,而JVM只会加载1遍,保证只有1个单例

具体实现

class Singleton {

    // 1. 创建静态内部类
    private static class Singleton2 {
       // 在静态内部类里创建单例
      private static  Singleton ourInstance  = new Singleton();
    }

    // 私有构造函数
    private Singleton() {
    }

    // 延迟加载、按需创建
    public static  Singleton newInstance() {
        return Singleton2.ourInstance;
    }

}

// 调用过程说明:
      // 1. 外部调用类的newInstance() 
      // 2. 自动调用Singleton2.ourInstance
       // 2.1 此时单例类Singleton2得到初始化
       // 2.2 而该类在装载 & 被初始化时,会初始化它的静态域,从而创建单例;
       // 2.3 由于是静态域,因此只会JVM只会加载1遍,Java虚拟机保证了线程安全性
      // 3. 最终只创建1个单例

5. 总结

本文主要对 单例模式 进行了全面介绍,包括原理 & 实现方式
对于实现方式,此处作出总结
这里写图片描述

链接:https://www.jianshu.com/p/b8c578b07fbc

树莓派部署Home Assistant:打造本地化智能家居大脑 家庭自动化旨在通过技术提升居住便利性与舒适度,其核心在于中枢控制系统对各类设备的统一调度。传统云端方案虽部署简便,但存在隐私泄露、网络依赖与生态壁垒等固有缺陷。本地化部署通过将控制逻辑与数据存储于家庭内部网络,从根本上解决了这些问题,实现了数据自主、离线可用与跨品牌联动。Home Assistant作为领先的开源家庭自动化平台,结合树莓派这一低功耗、高性价比的硬件载体,为构建私有、可靠的智能家居中枢提供了成熟方案。本文以树莓派4B为例,详细阐述了从系统安装、设备集成到自动化场景创建的完整实践流程,并深入探讨 阅读详情

相关推荐

ISP 基础知识储备

ISP(image signal processing),图像信号处理芯片,在手机摄像头和车载摄像头等领域有着广泛应用,是图像信号处理的核心芯片。 ISP pipeline 流程图如下: 光线经过lens镜头,投射到sensor上,经过光电转换成模拟电信号,再由A/D转换成数字信号,交给ISP芯片进行一系列的处理,在LENS部分也需要进行镜头校正、颜色矫正等一些操作。 然后,得到的bayer ...

qq_39444290的博客 778

Singleton,了解一下

package suanfa; import java.util.concurrent.locks.ReentrantLock; public class MySingleton { static class S1 { private static S1 instance; private S1() { } publi...

好好学习,天天向上 179

遥感大模型核心技术之自监督预训练技术研究(2025年9月版)

本文系统探讨了自监督预训练技术在遥感大模型构建中的核心作用。随着遥感数据进入"大数据"时代,传统监督学习面临"数据丰富、标签贫乏"的瓶颈,而自监督预训练通过设计代理任务从无标签数据中学习特征表示,成为驱动大模型发展的关键引擎。文章分析了遥感领域对自监督预训练的三大独特挑战:多源异构性、地理空间约束和时空动态性,并提出了针对性解决方案:掩码自编码(MAE)技术及其演进、地理对比学习与多模态融合、位置感知预训练与多任务学习。

panshengwu的博客 842

单例模式(Singleton Pattern) -(最通俗易懂的案例)

文章目录单例设计模式介绍单例模式的几种实现方式1.饿汉式(静态常量)2.懒汉式(线程不安全)3.懒汉式(线程安全)4.双重检查单例模式注意事项和细节说明 单例设计模式介绍 所谓类的单例设计模式,就是采用一定的方法保证在整个的软件系统中,对某个类只能存在唯一的实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 比如Hibernate的SessionFactory,它充当数据存储源的代理,并负...

世银的博客 1388

从IMU到机器人定位:手把手教你用ESKF(Error-State Kalman Filter)搞定传感器融合

本文详细介绍了如何使用ESKF(Error-State Kalman Filter)实现IMU与多传感器的融合,解决机器人定位中的积分漂移问题。通过代码示例和Gazebo仿真案例,展示了ESKF在自动驾驶和移动机器人中的核心应用,包括误差状态建模、预测过程实现和观测更新策略,帮助开发者掌握这一高效滤波技术。

weixin_33275503的博客 285

MATLAB R2022b 安装教程

1. 下载安装先放资源链接,百度网盘太贵了不想续了,换了夸克网盘。1. 下载安装。

qq_51654158的博客 2万+

设计模式之单例模式(Singleton)

单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛。创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。每一个创建型模式都在视图回答3个问题:3W -> 创建什么(What)、由谁创建(Who)和何时创建(When)。 本篇是创建型模式的第一篇,也是最简单的一个设计模式,虽然简单,但是其使用频率确是很高的。 单例模式(Singleton) 学习难度:★☆☆☆☆ 使用频率:★★★★☆

程小明的博客 4264

Android13 CarPowerManagementService启动流程分析

在CarPowerManagementService中init调用PowerHalService的setListener设置事件侦听器以接收车辆的电源事件。

liuning1985622的博客 957

设计模式:单例模式(Singleton)

设计模式:单例模式(Singleton)

ProgramNovice的博客 1070

【软考】高项论文写作常见模板

本文主要介绍了YYYY年MM月DD日,我所在公司承接了XXXX项目的建设过程,包括了XXX,XXX,XXX内容,涉及到XXX,XXX,XXX技术。本人在项目中承载着项目经理的角色,主要负责了XXX,XXX,XXX方面事宜。此项目时间紧,任务重,实施过程中,我们特别注重了1、XXX 2、XXX 3、XXX几个方面,经过团队的一致努力,本项目按时交付,运行至今,客户反馈良好。但是在实施过程中,也曝露除了一些问题,包括了XXX,XXX等,通过应急处理和协调,这些问题都得到了妥善解决,没有影响到项目进度。

奶爸的编程之路,也就一周冷个三天 1690

JavaScript实现斗地主(附完整源码)

JavaScript实现斗地主(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1505

c++ 设计模式(三)singleton 单例模式

单例模式的意图:保证一个类只有一个实例,并提供一个访问它的全局节点 使用性:             当类只能一个实例而且客户可以从从一个周所周知的访问点访问它             当这个唯一的实例应该是通过子类化可扩张的,并且客户应该无需修改代码就能使用一个扩展的实例 记住上面这段话,在下面的分析过程我们反复来品味这段话的所表达的意思,融会贯通。 一、什么是单例模式

chen 1万+

一文吃透 Tools for Applying SAP Notes:从 SNOTE、TCI 到 Solution Manager 与 SAP Cloud ALM

本文系统梳理了SAP技术与运维团队应用SAP Notes的高效工具与方法,涵盖On-Premise与云环境。文章首先阐述了精研SAP Notes工具的必要性,指出其是实施错误修复、法务变更和性能改进的关键载体。随后详细介绍了SNOTE、TCI、Solution Manager、Cloud ALM和Maintenance Planner等核心工具的定位与适用场景,并通过采购异常案例展示了标准更正流程。针对复杂修复场景,文章提出了TCI的批量处理方案,并强调将Note实施纳入变更治理流程的重要性。最后总结了三种

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 354

单例模式(singleton)

目录单例模式(Singleton):实现原理:应用场景:实例:饿汉式饿汉第一式——静态变量输出结果:分析:优点:缺点:小结:饿汉第二式——静态代码块输出结果:分析:懒汉式懒汉第一式——判断单例对象为null输出结果:分析:优点:缺点:小结:懒汉第二式——同步方法输出结果:分析:优点:缺点:小结:懒汉第三式——同步代码块输出结果:分析:优点:缺点:小结:双重检查输出结果:分析:优点:缺点:小结:静态内部类输出结果:分析:优点:缺点:小结:静态内部类输出结果:分析:优点:缺点:小结:总结 单例模式(Single

我想做阿信的博客 1166

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

简洁易懂的“讲”设计模式中的单例模式(Singleton)

原文:https://blog.youkuaiyun.com/dmk877/article/details/50311791 参考文章: https://www.jianshu.com/p/61b67ca754a3 https://www.jianshu.com/p/3bfd916f2bb2 https://blog.youkuaiyun.com/dmk877/article/details/50311791 设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 1.为什么使用单例模式?.

Soup's Blog 778

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++设计模式——单例模式(Singleton Pattern)

C++设计模式——单例模式(Singleton Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——单例模式(Singleton Pattern)目录定义代码示例懒汉模式线程/内存不安全方式智能指针+双检锁模式和智能指针+call_once模式局部静态变量模式饿汉模式总结参考资料 定义 单例模式顾名思义,保证一个类仅可以有一个实例化对象,并且提供一个可以访问它的全局接口。实现单例模式必须注意一下几点: 单例类只能由一个实例化对象。 单例类必须自己提供一个实例化对象。 单例类必须

leonardohaig的博客 1467

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

设计模式之---【Singleton(单例模式)】

      Singleton(单例模式)也有叫单件模式,是创建型模式的一种,也是最简单最常用的模式之一。       注意设计模式的学习并不能像学习语法或者公式那样死记硬背,因为各种模式是人们在工程实践中总结出来的,一定要带着应用场景去研究。或者说设计模式是一种思想,在面向对象的程序设计(Java、C++等)里讨论设计模式的比较多,C语言编程谈论设计模式比较少见,但是C语言里就不能实现面向对象...

pengshengli的博客 278

32种设计模式-单例模式(Singleton)

单例模式(Singleton) 介绍: 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 主要解决: 一个全局使用的类频繁地创建与销毁。 何时使用: 当您想控制实例数目,节省系统资源的时候。 如何解决: ...

小目标一个亿 4517

Java设计模式 —— 单例模式(Singleton)

Java设计模式 —— 单例模式(Singleton) 单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。” 定义 Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。” 特征: 只有一个实例对象,private构造函数 提供一个公有的方法获取实例对象,static getInstance方...

许浑的博客 627

单例模式(Singleton Pattern)

设计模式(Design Pattern),简称DP。

G81948577的博客 2015

设计模式之单例模式(singleton)

一、引言: 单例设计模式是非常常见的一种设计模式,在java中,单例设计模式确保了每个类只有一个实例,其实现的原理是将构造方法声明为private。 二、示例代码: 下面这段代码是最佳的单例模式代码: public class singleton{ public static void main(String[] args){ /* 调用三次,看是否只有一个对象生成 */ for(int...

achina2011jy的博客 189

Java设计模式—单例设计模式(Singleton Pattern)完全解析

认真做好每一件自己下定决心要做的事。

乐于分享,乐于讨论,欢迎大家积极讨论 3万+

设计模式之单例模式(Singleton)

设计模式之单例模式(Singleton) 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单...

choujiao3460的博客 129

设计模式之单例模式(Singleton Pattern)

如果 `_instance` 是 `None`,表示尚未创建实例,调用 `super().__new__(cls)` 创建一个新的实例,并初始化日志文件路径。- 它接收类本身(`cls`)作为第一个参数,以及可选的位置参数(`*args`)和关键字参数(` ** kwargs。- **全局访问点**:通过 `Logger()` 创建的实例总是返回同一个对象。- **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。- **单例模式**:确保 `Logger` 类只有一个实例。

li758568825的专栏 710

设计模式【3】——单例模式(Singleton 模式)

Singleton 模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如 C++中)中,我们也还是可以通过一个全局变量实现这一点。但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过 Singleton 模式来实现。Singleton 模式的实现需要说明的是,Singleton 不可以被实例化,因此我们将其构造函数声明为 protected 或者直接声明为 private。

sinat_42974726的博客 752

GOF23设计模式之单例模式-Singleton

本文解决了哪些问题? 1. 单例的几种实现,有何异同? 2. 什么是序列化与反序列化?如何防止反序列化破坏单例? 3. 何为反射破坏单例?如何避免? 4. 如何优雅的实现单例模式? 5. 框架中如何运用单例模式的?

zhengyong14350的博客 816
上一篇: Java网络编程(客户端/服务器,信息共享,文件上传)
下一篇: 代理模式(Proxy Pattern):静态代理 - 最易懂的设计模式解析
GraceJava
博客等级 码龄10年 131粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值