单例模式的学习

Unity框架学习【单例模式基类】{个人单例模式总结,框架单例模式总结} 这三天花了点时间,学习了B站唐老师的框架,里面有很多知识都有很强的复用性。 即,完成一次之后的很多工作都可以节省,而且优化整个程序的结构。 首先就是唐老师的课程都是递进式的,也就是前面的课程会很大程度的影响到后面的课程,而单例模式,是我目前使用最多的模式【要加紧学习新的设计模式】,例如在我的一本介绍《游戏设计模式》课本里面就有明确的写到。 “唯独单例模式,我们是要考虑怎么尽可能少的去使用他” 然后... 阅读详情

单例模式

 
​  对某些类只允许存在一个对象实例,并且提供一个取得其对象实例的方法【静态方法】

单例模式结构

在这里插入图片描述
​  单例(Singleton)类 声明一个名为 getInstance获取实例的静态方法来返回所属类的一个相同实例。
​  并且其构造方法需要对外隐藏,即getInstance()是唯一能获取该实例的唯一方法
 

Java中的体现:

​  1.在类中添加一个私有静态成员变量用于保存单例实例。

​  2.声明一个公有静态构建方法用于获取单例实例。

​  3.在静态方法中实现"延迟初始化"。 该方法会在首次被调用时创建一个新对象, 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。

​  4.将类的构造函数设为私有。 类的静态方法仍能调用构造函数, 但是其他对象不能调用。

​  5.检查客户端代码, 将对单例的构造函数的调用替换为对其静态构建方法的调用
 

 

分类

 

饿汉式(静态常量)

​  饿汉式是直接在内存new该实例

class Singleton{
    //2.本类内部创建对象实例
    private final static Singleton instance = new Singleton();

    //1.构造器私有化
    private Singleton(){

    }

    //3.提供公有静态方法,返回实例对象
    public static Singleton getInstance(){
        return instance;
    }
}

public class SingletonTest {
    public static void main(String[] args) {
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = instance1;

        System.out.println(instance1 == instance2);//true
        System.out.print(instance1.hashCode()+"|");
        System.out.println(instance2.hashCode());
        //1325547227|1325547227
    }
}

 
优点:

​ ​  在类装载时完成实例化,避免了线程同步问题

缺点:

​​  未达到Lazy Loading的效果

​​  若未使用过这个实例,则会造成内存的浪费
 

饿汉式(静态代码块)

class Singleton{
    private static Singleton instance;


    private Singleton(){
    }

    //在静态代码块中,创建单例对象
    static {
        instance = new Singleton();
    }


    public static Singleton getInstance(){
        return instance;
    }
}

 

懒汉式(线程不安全)

​  懒汉式是只有get该实例时才在内存中new该对象。

class Singleton{
    private static Singleton instance;


    private Singleton(){
    }

    //提供一个静态的公有方法
    //当使用该方法时,采取创建instance
    public static Singleton getInstance(){
        if (instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

优缺点:

​ ​  拥有Lazy Loading的效果。但只能在单线程下使用

​​  在多线程时,一个进程进入if判断,尚未往下执行,其他线程也通过了这个判断语句,则会产生多个实例

在实际开发中,不使用这种方式

 

懒汉式(线程安全,同步方法)

class Singleton{
    private static Singleton instance;


    private Singleton(){
    }

    //加入同步处理代码,解决线程不安全的问题
    public static synchronized Singleton getInstance(){
        if (instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

优缺点:

​ ​  解决了线程不安全的问题

​ ​  但效率太低了。当每个线程都想获取该实例,进入getInstance方法都需要进行同步,而该方法仅需要执行一次便足够了,若后面需要获取该实例们直接return即可。

 

懒汉式(线程不安全,同步代码块)

class Singleton{
    private static Singleton instance;


    private Singleton(){
    }


    public static Singleton getInstance(){
        if (instance == null){
            //加入同步处理代码,解决线程不安全的问题
            synchronized (Singleton.class) {
                instance = new Singleton();
            }
        }
        return instance;
    }
}

​  本意是对上一种的改进

​ ​  但并不能起到线程同步的作用。因为当进入if判断时,容易产生多个实例。
 

双重检查

class Singleton{
    private static volatile Singleton instance;

    private Singleton(){
    }

    public static Singleton getInstance(){
        if (instance == null){
            synchronized (Singleton.class) {
                if (instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

​ 优缺点说明:

​ ​  双重检查时多线程开发中常使用的。进行两次if判断,则保证了线程安全。

​ ​  实例化代码只进行一次。效率提高。

 

静态内部类

​  静态内部类的特点:

​ ​  ​  进行类装载时,不会被装载。保证懒加载。

​ ​  ​  当去调用时,则会去装载该类【而且只有一次】。保证线程安全

class Singleton{

    private Singleton(){
    }

    //静态内部类,有一个静态属性
    private static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }

    //返回静态内部类的静态属性
    public static Singleton getInstance(){
        return SingletonInstance.INSTANCE;
    }
}

优缺点:

​ ​  采用了类装载机制来保证初始化只有一个线程

​​  静态内部类在外部类装载时并不会立即实例化,而仅有当需要实例化,调用getInstance()时,才会装载SingletonInstance类,从而完成实例化

 

枚举

enum Singleton{
    INSTANCE;

    public void sayOK(){
        System.out.println("This is OK.");
    }
}

public class SingletonTest {
    public static void main(String[] args) {
        Singleton instance1 = Singleton.INSTANCE;
        Singleton instance2 = Singleton.INSTANCE;

        System.out.println(instance1 == instance2);//true
        System.out.print(instance1.hashCode()+"|");
        System.out.println(instance2.hashCode());
        //1325547227|1325547227

        instance1.sayOK();//This is OK.
    }
}

优缺点:

​ ​  借助枚举实现,不仅避免多线程同步问题,而且还能防止反序列化重现创建新的对象。

​ ​  👍也是Effective Java作者Josh Bloch 提倡的方式
 

单例模式的应用场景

​  如果程序中的某个类对于所有客户端只有一个可用的实例,可以使用单例模式。

​  如果你需要更加严格地控制全局变量,可以使用单例模式。
 

优缺点

​  优点:
​  ​  ✔️你可以保证一个类只有一个实例
​  ​  ✔️你获得了一个指向该实例地全局访问节点
​​    ✔️仅在首次请求单例对象时对其初始化

​  缺点:
​  ​  ❌单例模式可能会掩盖不良设计,例如程序各组件之间相互了解过多等。
​  ​  ❌该模式在多线程环境下需要进行处理,因此需要避免多个线程多次创建单例对象。
​  ​  ❌单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。 由于单例类的构造函数是私有的, 而且绝大部分语言无法重写静态方法, 所以你需要想出仔细考虑模拟单例的方法。 要么干脆不编写测试代码, 或者不使用单例模式。

从零到一:用Python打造你的智能交互桌宠,附完整源码与打包指南 本文详细介绍了如何从零开始使用Python开发智能交互桌宠,涵盖环境配置、窗口创建、动图加载、交互功能实现及打包发布全流程。教程特别适合零基础开发者,通过完整源码和分步指南,帮助读者快速掌握桌面宠物开发技巧,打造个性化AI伴侣。 阅读详情

相关推荐

Tube-based MPC完全指南:RCI集合构造与Matlab实现

模型预测控制(MPC)在实际工程中常因模型失配和外部扰动导致硬约束被突破,而鲁棒控制中的Tube-based MPC通过将单条预测轨迹扩展为“管道”集合,为不确定性提供了严格的安全边界。其核心在于利用鲁棒控制不变集(RCI)离线构造安全域,再结合在线标称MPC与反馈校正实现约束的硬保证。针对非线性系统,利普希茨条件为等效扰动的放大和RCI的构造提供了理论基础,使得算法既能保留非线性描述,又不牺牲在线计算效率。该方法适用于带扰动和参数漂移的机械系统、过程控制及嵌入式控制场景。本文以摩擦力非线性系统为例,从RC

weixin_32642109的博客 216

单例模式与instance = new Singleton();

public static Singleton getInstance() {           if (instance == null) {               synchronized (instance) {                   if (instance == null) {                       instance = new Sin

qq_20125305的专栏 1026

TouchSocket TcpService:构建高性能Tcp服务的终极利器

/ 接收到的数据data");// 回复客户端await ((ITcpSessionClient)client).SendAsync("服务端已收到消息!");// 继续执行后续插件TouchSocket的TCPService以极简的API、强大的扩展性和卓越的性能,重新定义了.NET TCP服务的开发体验。无论是物联网平台还是金融级实时通信系统,TCPService均能提供可靠的基础设施支持。立即探索示例项目,开启你的高性能服务开发之旅!扩展阅读如何实现WebSocket服务?

若汝棋茗 的博客 1461

单例模式判断两次为NULL的原因

单线程中: Singleton* getInstance() { if (instance == NULL) instance = new Singleton(); return instance; } 这样写可以保证只取得了一个实例。但是在多线程的环境下却不行了,因为很可能两个线程同时运行到if (instance == NULL)这一句,导致可能会产生两个实例...

迪迦 • 奥特曼 5526

用C#完成最小二乘法拟合平面方程,再计算点到面的距离

【代码】用C#完成最小二乘法拟合平面方程,再计算点到面的距离。

MechMaster 647

⭐️【2024年新版教程】vmware tools安装步骤(Windows、Linux、MacOS版本)

VMware Tools是VMware提供的一套实用工具,它可以增强虚拟机与宿主机之间的交互性能,如改进显示性能、优化鼠标和键盘性能、提供时间同步功能等。无论是在Windows、Linux还是MacOS虚拟机上,安装VMware Tools都可以提高虚拟机的使用体验。以上就是在不同操作系统上安装VMware Tools的步骤,希望对您有所帮助。

Python老吕的博客 6万+

同一个字符串hash值相同吗_Hash在编程中的应用

Hashing is the transformation of a string of characters into a usually shorter fixed-length value or key that represents the original string. Hashing is used to index and retrieve items in a database ...

weixin_39962199的博客 2889

浏览器缓存导致代码不更新?一招解决部署后用户仍看到旧页面的问题

方案效果适用场景文件名哈希永久解决前端工程化项目HTTP缓存头控制精准控制需服务器权限Meta标签部分生效临时补救方案最佳实践:入口HTML禁用缓存,静态资源使用哈希文件名 + 长期缓存,达到「秒级更新」+「高性能」的平衡!

江拥羡橙的博客 810

学习——单例模式(Singleton Pattern)

单例模式是23个模式中比较简单的模式,应用也非常广泛,如在Spring中,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理这些Bean的生命期,决定什么时候创建出来,什么时候销毁,销毁的时候要如何处理,等等。如果采用非单例模式(Prototype类型),则Bean初始化后的管理交由J2EE容器,Spring容器不再跟踪管理Bean的生命周期。

qqxhb 资源共享 317

DSPy 入门: 再见提示,你好编程

DSPy("Declarative Self-improving Language Programs (in Python)",发音为 "dee-es-pie")[1] 是斯坦福大学 NLP 研究人员开发的 "基础模型编程 "框架。它强调编程而非提示,并将构建基于 LM 的管道从操作提示转向编程。因此,它旨在解决构建基于 LM 应用程序时的脆弱性问题。DSPy 还将程序的信息流与每一步的参数(提示和 LM 权重)分离开来,为构建基于 LM 的应用程序提供了更系统的方法。

具身机器人和通用AI 3486

ESP32开发进阶:1.接入文心一言

ESP32开发进阶:接入文心一言大模型,串口对话

qq_53529450的博客 1431

单例模式深入学习与总结 singleton pattern

描述: 单例模式是在avascript中使用的最基本最常用的模式之一。 这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一的变量进行访问。 通过确保单例对象中只存在一份实例,你就可以确信自己的所有代码使用的都是同样的全局资源。 定义: 按照传统的意义,单例是一个只能被实例化一次并且可以通过一个众所周知的访问点访问的类。 按照这个定义,第一个例子并不算是个...

weixin_30299539的博客 92

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

4655

单例模式(Singleton Pattern)学习

单例模式简单单利模式懒汉模式懒汉模式升级版饿汉模式(推荐使用)内部静态模式 简单单利模式 /** * @author FeianLing * @date 2019/7/11 简单单例模式,只适用于单线程(不推荐) */ public class Singleton { private static Singleton singleton = null; private Single...

凌飞安 253

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

《游戏编程模式》学习笔记(六)单例模式 Singleton Pattern

保证一个类只有一个实例,并且提供了访问该实例的全局访问点。定义这种东西一般都是不说人话的,要想要理解这句话的意思,我们得把它揉开了才能搞明白。我们先看前半句 “保证一个类只有一个实例”,单例一般使用类来实现,也就是说,这个单例类,其有且只能有一个实例化的对象instance,一旦出现多个,就不是单例模式。后半句“并且提供了访问该实例的全局访问点”,这句话的意思是,这个实例化的对象是全局可见的,任何系统,任何类都可以访问这个实例化的单例对象。

Currybeefer的博客 1292

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

3.单例模式Singleton Pattern--学习笔记

1.场景:认为皇帝是个单例模式, 有皇帝,有大臣,大臣是要上朝参见皇帝的,今参拜的皇帝应该和昨、前的一样, 大臣磕完头,抬头一看,嗨,还是昨那个皇帝,单例模式,绝对的单例模式, 2.类图: 3.程序 public class Emperor { private static Emperor emperor = null; private Emperor() { } public static Emperor getInstance(){ if (emperor == null){

weixin_39795049的博客 214

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

设计模式学习-- 3.单例模式(Singleton Pattern)

======================================================================================================================================================== V3版本 練習的目標: 1.通過單例模式,獲取整形的唯一ID 2.兩個Main多線程同時測試。 package com.designepattern.singleton.v3; /...

u010031813的博客 160

设计模式 - 学习笔记 - 单例模式Singleton Pattern

设计模式 - 学习笔记 - 单例模式Singleton Pattern学习总结应用场景UML代码示例饿汉 hungry 学习总结 单列的核心就是这东西,我们只想要一份,无论多少人调用它。都是调这个实例。 饱汉:调用时才创建实例,能省点是点。 饿汉:初始化时直接生成实例,要用时直接调,无需等待。当然如果一直都没调它,那就活活浪费着。。。 Java实现中考虑线程安全问题,衍生出了8种方式。其实好多是凑数的没啥意义。 线程安全问题来自于饱汉模式运行时动态创建实例,多线程自然就会有撞车风险。饿汉模式就不存在线程安

灵台方寸山斜月三星洞 485

Golang学习笔记_27——单例模式

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这种模式在很多场景下非常有用,比如数据库连接池、日志系统等,这些场景中我们通常希望在整个应用程序中只有一个对象来负责相关的操作,避免资源的浪费和数据的不一致。

LuckyLay的博客 1900

《学习Java设计模式之单例模式(Singleton Pattern)》

单例模式(Singleton Pattern) 1、单例模式的概念 单例模式 又叫做 单态模式 或者 单件模式 。 单例模式 是指 保证JVM中一个类仅有一个实例 ,并提供一个访问它的全局访问点。 单例模式 中的 单例 通常用来代表那些本质上 具有唯一性的系统组件(或者叫做资源)。比如文件...

138

设计模式学习总结-单例模式(Singleton Pattern)

问题:在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,并提只有一个全局访问点,才能确保它们的逻辑正确性、以及良好的效率。 定义:单例模式也叫也叫单件模式是一种对象创建模式, 保证一个类仅有一个实例,并提供一个该实例全局的访问点。这个类称为单例类。 意图:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式有三个要点:一是某个类只能有一个实例;二是...

weixin_34144450的博客 92

设计模式学习笔记十:单例模式(Singleton Pattern)

设计模式学习笔记十:单例模式(Singleton Pattern)     1.概述     单例模式(Singleton Pattern)又称单件模式,单例模式保证一个类仅有一个实例,并提供一个访问的他的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化对个对象,一个最好的办法就是,让类自身负责保存他的唯一实例,这个类可以保证没有其他实例可以被创建

AlbenXie的博客 483

设计模式-单例模式学习笔记及心得感悟

单例模式 单例模式的定义    确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。     通用代码如下 //饿汉单例模式public class Singleton{ private static final Singleton singleton = new Singleton(); //限制产生多个对象 private Singlet

mmrx的博客 993

HeadFirst 设计模式学习笔记5--单例模式

本文已搬家至【HeadFirst 设计模式学习笔记】5 单例模式

gnuhpc的专栏 2738

单例模式学习

单例模式学习 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 想确保任何情况下都绝对只有1个实例 想在程序上表现出“只存在一个实例” 本模式是能生成一个实例类,因此以Singleton命名。 #mermaid-svg-OG8Xymaq7hPYARrj .label{font-family:'trebuchet

weixin_43840232的博客 155
上一篇: 设计模式的原则
下一篇: 工厂方法模式&&抽象工厂模式
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值