`
Diversity
  • 浏览: 3810 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

(转)单例模式(Singleton Pattern)

阅读更多

Singleton模式的宗旨在于确保某个类只有一个实例, 并且为之提供一个全局访问点.

单例模式的应用场景:

     1.在资源管理方面的经常使用单例模式

        比如打印机的 Printer Spooler 是单例模式,这样可以避免两个作业同时输出到打印机.
    2.从系统性能方面考虑使用单例模式

       实例的创建是需要消耗系统资源的,而且是费时的,重复的对象最后还需要垃圾回收器回收,更是加重了系统的负担.

如何实现单例模式



       在设计单例模式的时候,首先要确定何时实例化该类的实例。第一种选择是将该单例对象作为单例类的一个静态域实例化。示例如下:

      

package com.zhaipuhong.designpattern;   
  
public class Singleton {   
    private static Singleton singleton = new Singleton();  //私有的本单例类的静态域   
       
    /**  
     * 私有的构造方法,阻止了用户通过此构造方法直接创建实例  
     */  
    private Singleton(){}   
       
    public Singleton getInstance(){   
        return singleton;   
    }   
}  
 




第二种情况,如果不希望提前创建单例对象,可以等到第一次使用该单例对象的时候再创建它。即惰性出初始化(lazy-initialize)。示例如下:

package com.zhaipuhong.designpattern;   
  
public class LazySingleton {   
    private static LazySingleton lazySingleton;  //私有的静态本单例域   
       
    private LazySingleton(){ } //私有的构造方法   
       
    public LazySingleton getInstance(){  //获取本单例的唯一实例   
        if(lazySingleton == null){   
            lazySingleton = new LazySingleton();     
        }   
        return lazySingleton;   
    }   
}  


        第二种方式存在的因为不仅仅是从一种语言技巧,是有实际需要的。当应用程序或系统在静态初始化阶段可能无法收集到足够的信息来实例化单例对象,有的需要等到运行时通过计算才能获得,这时候你就应该使用第二种方式。



        另外从系统性能和优化方面来讲,我更喜欢第二种方式,需要时再创建。







单例模式的扩展



        上述惰性单例模式在单线程环境是没有问题的。但是如果是在多线程环境必须小心了。在多线程环境,我们无法保证

一个方法能够持续执行到结束,其它线程的方法才开始。那么多个线程有可能在微小的时间段来同时尝试初始化单例类,此时他们都发现该单例实例尚为空。



        看起来我们需要对“检查单例对象是否已经被创建”进行同步,但是这样一来,所以的线程都必须等待这个检查过程的完成。这种同步会造成严重的性能瓶劲。示例代码如下:

package com.zhaipuhong.designpattern;   
  
public class SyncSingleton {   
    private static SyncSingleton syncSingleton;   
    private static final Object classLock = SyncSingleton.class;  //同步琐   
       
    private SyncSingleton(){}   
       
    public SyncSingleton getInstance(){   
        synchronized(classLock){   
            if(syncSingleton == null)   
                syncSingleton = new SyncSingleton();   
            return syncSingleton;   
        }   
    }   
}  

 




        另一种方法是我们在检查之后(if (instance == null))再放置一些同步代码, 但是还是可能出现多个现成同时通过了检查。我们改进一下,检查之后,在同步代码中再检查一边,这样就是“双重锁定检查”模式了。它能将非必须的锁定优化掉。这里的同步检查最多发生一次。不会造成性能瓶劲。示例代码如下:

package com.zhaipuhong.designpattern;   
  
public class DoubleCheckedLocking {   
    private static DoubleCheckedLocking dcl;   
       
    private DoubleCheckedLocking(){}   
       
    private synchronized static void doSync(){   
        if(dcl == null)    
            dcl = new DoubleCheckedLocking();   
    }   
       
    public DoubleCheckedLocking getInstance(){   
        if(dcl == null)  //一重检查   
            doSync();    //同步的二重检查   
        return dcl;   
    }   
}  



分享到:
评论

相关推荐

    单例模式 Singleton Pattern

    ### 单例模式 Singleton Pattern #### 概述 单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其...

    通过go语言实现单例模式(Singleton Pattern).rar

    在Go语言中,实现单例模式(Singleton Pattern)通常涉及确保一个类只有一个实例,并提供一个全局访问点来获取该实例。由于Go语言没有传统的类和对象概念,但具有结构体(struct)和函数,我们可以通过使用包级变量...

    Singleton pattern单例模式应用

    ### Singleton Pattern 单例模式应用详解 #### 一、单例模式概述 单例模式(Singleton Pattern)是一种常用的软件设计模式,在系统中确保某个类只有一个实例,并提供一个全局访问点。这种模式通常用于控制资源的...

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

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

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

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

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

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

    单例模式Singleton

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

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

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

    C#单例模式(Singleton Pattern)实例教程

    本文以实例形式讲述了C#单例模式(Singleton Pattern)的实现方法,分享给大家供大家参考。具体实现方法如下: 一般来说,当从应用程序全局的角度来看,如果只允许类的一个实例产生,就可以考虑单例模式。 1.即时加载...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    3、单例模式SINGLETON PATTERN 4、多例模式MULTITION PATTERN 5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板...

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

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

    第6讲_单例模式(Singleton)

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

    单例模式应用场景

    其中,单例模式(Singleton Pattern)作为最简单的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。尽管有些设计模式专家认为它过于简单而不能称为真正的“模式”,但单例模式因其简洁性和实用性...

    设计模式_单例模式.zip

    单例模式是软件设计中的一种常见模式,它的主要目的是确保一个类只有一个实例,并提供全局访问点。这样的设计在很多场景下都非常有用,比如配置管理、线程池、缓存服务等,因为这些服务通常只需要一个实例来协调整个...

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

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

    通过javascript实现单例模式.rar

    在JavaScript中,单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在JavaScript中实现单例模式通常涉及使用一个对象字面量或创建一个包含实例的...

    Java单例模式应用研究.pdf

    单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局访问。这种模式在实际软件开发中有着极其广泛的应用...

    .Net 单例模式(Singleton)

     单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有...

Global site tag (gtag.js) - Google Analytics