`

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

阅读更多

    单例模式:确保一个类只有一个实例,并提供一个全局访问点。单例可以延迟实例化(lazy instantiate)。

 

// 经典的单件模式实现
public class Singleton {
    /* 利用一个静态变量来记录Singleton类的唯一实例 */
private static Singleton uniqueInstance;
// 这里是其他的有用实例化变量
private Singleton() {
    /* 把构造器声明为私有的,只有在Singleton类内才可以调用它*/
}
/* 用getInstance()方法实例化对象,并返回这个实例 */
public static Singleton getInstance() {
    if (uniqueInstance == null) {
    /* 如果我们不需要这个实例,它就永远不会产生,这就是延迟实例化*/
    uniqueInstance = new Singleton();
}

return uniqueInstance;
}
// 这里是其他有用的方法
}

    有些对象我们只需要一个,例如线程池、缓存、处理偏好设置和注册表的对象、日志对象、充当打印机、显卡等设备的驱动程序的对象。而单例模式给我们了一个全局的访问点,和全局变量一样方便,又没有全局变量的缺点,如果将对象赋值给一个全局变量,那么你必须在程序一开始就创建好对象,如果这个对象非常耗资源,而程序在这次的执行过程中又一直没有用它,这就形成了浪费。

    单例模式中的多线程问题:两个线程有可能会创建两个实例,那么该如何处理这种情况呢:

    A.只要把getInstance()变成同步(synchronized)方法(会降低性能,其实只有第一次执行此方法时,才需要同步,如果getInstance()的性能对应用程序不是很关键,就用这种方法)

 

public class Singleton {
    private static Singleton uniqueInstance;

    // 其他有用的实例化的变量
   Private Singleton() {}

   Public static synchronized Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }

        return uniqueInstance;
   }
// 其他有用的方法
}

   B. 使用“急切”创建实例(饥渴式),而不用延迟实例化(懒汉式)的做法

 

public class Singleton {
    /* 在静态初始化器(static initializen)中创建单件 这保证了线程安全(thread safe)*/
private static final Singleton uniqueInstance = new Singleton();

public static Singleton getInstance() {
    return uniqueInstance; // 直接返回实例
}
}

   C.用“双重检查加锁”(double-checked locking,首先检查实例是否已经创建了,如果尚未创建,才进行同步),在个getInstance()中减少使用同步:

 

public class Singleton {
    /* volatile关键字确保:当uniqueInstance变量被初始化成Singleton实例时,多个线程正确地处理uniqueInstance变量 */
private volatile static Singleton uniqueInstance;

private Singleton() {}

public static Singleton getInstance() {
    if (uniqueInstance == null) { // 检查实例,如果不存在,就进入同步区块
    synchronized (Singleton.class) {//只有第一次才彻底执行这里的代码
    if (uniqueInstance == null) {//进入区块后,再检查一次
        uniqueInstance = new Singleton();
}//Singleton.class是该类对应的字节码文件对象。
}
}

return uniqueInstance;
}

   如果使用 多个类加载器,可能导致单例失效而产生多个实例。

分享到:
评论

相关推荐

    c++-设计模式之单例模式(Singleton Pattern)

    单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于需要全局共享资源的场景,比如配置管理、日志记录等。 单例模式的组成 私有构造函数:防止外部...

    创建型模式之单例模式(Singleton Pattern)

    单例模式是软件设计模式中的一种,属于创建型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源、配置对象或者缓存服务等。 单例模式的核心...

    设计模式 之 “单例模式[Singleton Pattern]”

    **单例模式(Singleton Pattern)**是软件设计模式中的一种基础模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、数据库连接池等,这些都...

    Singleton pattern单例模式应用

    单例模式(Singleton Pattern)是一种常用的软件设计模式,在系统中确保某个类只有一个实例,并提供一个全局访问点。这种模式通常用于控制资源的消耗,比如数据库连接、线程池等,以及确保某个系统配置的一致性。 #...

    单例模式 Singleton Pattern

    单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其常见,因为它能够帮助开发者控制对象的创建过程...

    C++中的三大设计模式:单例模式、工厂模式与观察者模式的代码实现

    内容概要:本文档介绍了三个经典的软件设计模式——单例模式(Singleton Pattern)、工厂模式(Factory Pattern)以及观察者模式(Observer Pattern)的具体实现,并给出了带有详细注释的C++代码范例。对每个设计模式都有...

    java设计模式之单例模式详解

    单例模式(Singleton Pattern)是面向对象设计模式中的一种,属于创建型模式。它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。单例模式的核心在于控制类的实例化过程,保证在任何情况下都只会创建一...

    常见设计模式—单例模式(Singleton)

    单例模式(Singleton Pattern)是设计模式中最简单的模式之一,属于创建型模式。这种设计模式主要是类的对象只有一个实例,不需要每次new 创造。而我们要做的的就是确保这个对象创建的唯一。然后根据一些特征进行...

    ava常用设计模式-单例模式

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 1. 单例类只能有一个实例。 2. 单例类必须自己创建自己的唯一实例。 3. 单例类必须给所有其他对象提供这一实例。 单例模式有多种实现...

    设计模式之单例模式

    单例模式(Singleton Pattern)是软件设计模式中的一个重要组成部分,属于创建型模式之一。它保证一个类仅有一个实例,并提供一个全局访问点。单例模式的核心在于确保某个类只有一个实例存在,并且这个实例能够被...

    PHP设计模式之单例模式定义与用法分析

    单例模式(Singleton Pattern 单件模式或单元素模式),是常见的一种设计模式,它有三个特点 1.只能有一个实例 2.必须自行创建这个实例 3.必须给其他对象提供这一实例 下面用PHP代码实现一下 <?PHP /** *...

    第6讲_单例模式(Singleton)

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心意图是确保一个类在整个系统中只有一个实例,并提供一个全局访问点。这样的设计可以避免资源浪费,尤其在处理那些需要共享状态且频繁使用的对象时...

    设计模式_单例模式.zip

    总结来说,单例模式是一种常见的设计模式,用于控制类的实例化过程,保证在整个系统中只有一个实例存在。在Java中,我们可以使用多种方式来实现单例,包括传统的同步方法、双重检查锁定和枚举。然而,使用单例模式时...

    [创建型模式] 单例模式(Singleton Pattern)

    单例就是单个对象的意思,指在系统运行期间,一个类最多只能创建一个对象,且该类能自行创建这个对象的一种编码设计模式。 单例模式有两个特点: 在系统的整个生命周期内,单例对象最多只能有一个 单例对象必须由...

    设计模式-Java单例模式的各种实现实例

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。这种模式通常用于需要频繁地创建和销毁的对象,以减少系统性能开销。 单例模式的优点: ...

    C#单例模式(Singleton Pattern)详解

    C#单例模式(Singleton Pattern)是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。下面我们将详细介绍C#单例模式的定义、实现和优化。 单例模式的定义: 单例模式的主要目的是确保一个...

    设计模式—单例模式

    设计模式中的装饰器模式(Decorator Pattern)与单例模式不同,它是一种结构型模式,用于在运行时动态地给对象添加新的行为。装饰器模式通过将对象包装在一个装饰类中来扩展其功能,而不是通过继承来实现。这种模式...

    单例模式Singleton

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式在很多场景下非常有用,比如管理系统资源、...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

    Python 程序语言设计模式思路-创建型模式:单例模式,确保一个类的唯一实例(装饰器)面向对象编程、继承

    单例模式(Singleton Pattern)作为创建型模式中的一种,旨在确保一个类在系统中只有一个实例,并提供全局访问点。

Global site tag (gtag.js) - Google Analytics