首页 > 其他分享 >单例模式

单例模式

时间:2023-09-13 15:22:05浏览次数:25  
标签:private instance 实例 static 模式 单例 public

面向对象编程中,单例模式是一个经常被讨论的话题。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一种全局访问点来获取该实例。在本篇博客中,我们将深入探讨单例模式的重要概念、实现方式、以及何时使用它。

什么是单例模式?

单例模式是一种确保在整个应用程序中只有一个对象实例存在的设计模式。这意味着无论在应用程序的哪个地方,都只能获得同一个对象。这对于需要共享资源、控制全局状态、或者节省资源的情况非常有用。

单例模式的特点

  1. 单一实例:单例模式确保一个类只有一个实例。
  2. 全局访问点:通过一个全局的访问点(通常是静态方法)来获取该实例。
  3. 懒加载或饿加载:可以延迟创建实例,或者在应用程序启动时就创建实例。
  4. 线程安全性:要确保在多线程环境中的安全访问。

单例模式的实现方式

1. 懒汉式(Lazy Initialization)
懒汉式是在第一次使用时才创建单例实例。它是懒加载的方式,只有在需要时才创建对象。

public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {}

    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

2. 饿汉式(Eager Initialization)
饿汉式在类加载时就创建单例实例,适用于实例创建代价低廉的情况。

public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {}

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

3. 双重检查锁(Double-Checked Locking)
双重检查锁结合了懒汉式和饿汉式的优点,既能在需要时才创建实例,又能保证线程安全。

public class DoubleCheckedSingleton {
    private static volatile DoubleCheckedSingleton instance;

    private DoubleCheckedSingleton() {}

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

4. 静态内部类(Static Inner Class)
静态内部类方式使用了类加载机制,保证了懒加载和线程安全。

public class StaticInnerClassSingleton {
    private StaticInnerClassSingleton() {}

    private static class SingletonHolder {
        private static final StaticInnerClassSingleton instance = new StaticInnerClassSingleton();
    }

    public static StaticInnerClassSingleton getInstance() {
        return SingletonHolder.instance;
    }
}

使用场景

单例模式适用于需要确保系统中只有一个实例存在的情况,例如全局配置管理、线程池、数据库连接池、日志记录器等。

最佳实践

  • 使用私有构造函数,防止外部直接实例化。
  • 提供全局访问点,通常是公共静态方法 getInstance()。
  • 考虑线程安全性,使用线程安全机制确保多线程环境下的安全。
  • 注意性能,选择适合应用程序需求的实现方式,避免过度同步。

标签:private,instance,实例,static,模式,单例,public
From: https://www.cnblogs.com/Cloong/p/17699789.html

相关文章

  • 观察者模式
    观察者模式,也称发布订阅模式,主题方发布,观察方订阅。observe.h/***Copyright(C)2023-09-1314:06zxinlog<[email protected]>**/#include<func.h>#include<iostream>#include<list>usingstd::cout;usingstd::endl;usingstd::list;classObserve......
  • 03-开发环境介绍_交互模式的使用_IDLE介绍和使用
       ......
  • 两个numpy技巧(模式识别总结)
    1.查找符合特定条件的Numpyndarray对象中元素的数量np.count_nonzero()函数可以用来完成此操作。以下是使用np.count_nonzero()函数快速查找数组中小于5的元素数量的示例:count=np.count_nonzero(array<5)在此示例中,我们使用array<5来获取array中小于5的所有元素,然后......
  • 设计模式-门面模式
    门面模式(文章目录)1、什么是门面模式  门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。注意这里针对的是接口。  这个定义很简洁,我再进一步解释一下。  假设有一个系统A,提供了a、b、c、d四个接口。系统B完成某个业务功能,需要调用A系统的......
  • Oauth2.0授权码模式
    参考:https://blog.csdn.net/qq15035899256/article/details/129541483授权码模式这种模式是最安全的一种模式,也是推荐使用的一种,比如我们手机上的很多App都是使用的这种模式。相比隐式授权模式,它并不会直接返回Token,而是返回授权码,真正的Token是通过应用服务器访问验证服......
  • UI 自动化测试框架:PO 模式+数据驱动
    1.PO设计模式简介什么是PO模式?PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个Page类,并以页面为单位来写测试用例,实现页面对象和测试用例的分离。PO模式的设计思想与面向对象相似,能让测试代码变得可读性更好,可维护性高,复用性高。PO模......
  • 6. 前端设计模式之观察者模式
    使用观察者模式,我们可以将某些对象(观察者)订阅到另一个对象(可观察对象)。当一个事件发生时,可观察对象会通知它的所有观察者!这个模式出境的概率就比较高了,无论是在前端还是后端,都能见到它的身影,特别跟事件有关的场景。从定义看这个模式涉及到两种对象,一种可观察对象也就是观察的......
  • 单例模式的五种实现方式
    参考https://blog.csdn.net/qq_42372017/article/details/1211924451.单例模式的四大原则构造方法私有以静态方法或者枚举返回实例多线程环境下都是访问同一个实例反序列化时不会重新构建对象2.单例模式通常有5种实现方法2-1饿汉模式饿汉模式会在类初始化时就提前......
  • 设计模式-装饰器模式
    装饰器模式(文章目录)什么是装饰器模式  装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。为什么使用装饰器模式使用装饰者模式有如下好处:  1.避免了类爆炸问题,简化了设计  2.易于扩展,可以灵活组......
  • Android开发中常见的设计模式
    Android开发中常见的设计模式对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次。而在android开发中,必要的了解一些设计模式又是非常有必要的。对于想系统的学习设计模式的同学,这里推荐2本书。一本是HeadFirst系列的HeadH......