`
king_tt
  • 浏览: 2233809 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【设计模式】学习笔记7:单件模式(Singleton)

阅读更多

 

 

本文出自 http://blog.csdn.net/shuangde800

 
 

 

走进单件模式

有些对象我们只需要一个,比如:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机,显卡等设备的驱动程序对象等。

这些类的对象只能有一个实例,如果有多个,然而会导致许多问题产生。

有人可能觉得,这只要用全局变量或者静态变量就可以做到了

这样做的缺点:

必须程序一开始就创建对象,但是有些对象可能用不到,耗费资源。而单件模式在需要时才创建

 

单间模式的实现

 

单件模式的经典但简陋(有问题)的实现:

把构造函数设置为私有的,再加一个静态方法用来创建对象并返回。

public Singleton{
    
    private static Sigleton uniqueInstance;

    // 构造器是私有的,只有类内部方法才能创建类
    private Singleton() { }

    public static MyClass getInstance(){
        if(uniqueInstance == null){ // 只有是null的才创建对象
            uniqueInstance = new Singleton(); 
        }
        return uniqueInstance;
    }
}

 

上面那个做法,会出现问题,原因是多线程产生的问题。

假如有两个线程要几乎同时要创建一个对象,那么将会发生下面的情况:

看上图,发现Thread one和Thread two都各自创建了一个对象!

 

 

 

解决方案1

把getInstance( )变成同步(synchronized)方法,多线程灾难几乎就可以轻易解决了。

public Singleton{
    
    private static Sigleton uniqueInstance;

    // 构造器是私有的,只有类内部方法才能创建类
    private Singleton() { }

    // 通过增加synchronized关键字,会迫使每个线程在进入这个
    // 方法之前,要先等候别的线程离开该方法。
    // 也就是说,不会有两个线程可以同时进入这个方法
    public static synchronized MyClass getInstance(){
        if(uniqueInstance == null){ // 只有是null的才创建对象
            uniqueInstance = new Singleton(); 
        }
        return uniqueInstance;
    }
}



缺点: 每次用该方法都要同步,会降低拖垮程序的性能。同步一个方法可能会造成程序执行效率下降100倍。

 

 

解决方案2:急切实例化

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

    // 构造器是私有的,只有类内部方法才能创建类
    private Singleton() { }

    public static synchronized MyClass getInstance(){
        return uniqueInstance;
    }
}



解决方案3: 用“双重检查加锁”,在getInstance()中减少使用同步

利用“双重检查加锁”(double-checked locking),首先检查实例是否已经创建了,如果尚未创建,“才”进行同步。

这样,只有第一次会同步,之后再也不会了

public Singleton{

    // 注意这里加了volatile关键字
    // volatile关键字确保:当uniqueInstance变量被初始化成Singleton实例时
    // 多个线程正确地处理uniqueInstance变量
    private static volatile Sigleton uniqueInstance;

    private Singleton() { }

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

 

注意! 双重检查加锁不使用于java 1.4以及更早的版本。

 

 

定义单件模式

单件模式确保一个类只有一个实例,并提供一个全局访问点

 

单件模式的类图很简单

 

 

 

全局变量 VS 单件模式

在Java中,全局变量基本上就是对对象的静态引用。

在这样的情况下使用全局变量会有一些缺点,我们已经提到了期中一个:急切实例化 VS.延迟实例化。

但是我们要记住这个模式的目的:确保类只有一个实例并提供全局访问。

全局变量也会变相鼓励开发人员,用许多全局变量指向许多小对象来造成命名空间(namespace)的污染。

单件模式不鼓励这样的现象,但单件仍然可能被滥用。

 

 

 

 

分享到:
评论

相关推荐

    面向对象设计模式:Singleton 单件(创建型模式)

    李建忠面向对象设计模式视频精讲:Singleton 单件(创建型模式)

    设计模式学习笔记大全

    以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...

    C#视频-面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)

    C#视频-面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)

    Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

    单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...

    设计模式 单件模式 设计模式 单件模式

    "设计模式-单件模式" 单件模式是指确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的程序设计方法。单件模式是一种非常实用的设计模式,它可以控制一个类的实例数量,使得调用者可以从...

    C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)

    标题和描述均聚焦于"C#面向对象设计模式"之中的"Singleton单件(创建型模式)",这是一种在软件工程领域广泛运用的设计模式,其核心在于确保一个类只有一个实例,并提供一个全局访问点,以实现资源的有效管理和控制。...

    C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) (Level 300)

    本篇文章将深入探讨“Singleton”(单例)模式,这是一种创建型设计模式,用于确保一个类只有一个实例,并提供全局访问点。 Singleton模式的核心思想是限制类的实例化过程,确保在系统运行期间,类的实例只有一个。...

    C++设计模式课件12_Singleton_单件模式.pdf

    ### 单件模式(Singleton Pattern)详解 #### 概述 单件模式是软件设计模式中最为基础且应用广泛的一种模式。它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。此模式通常用于那些需要频繁创建、消耗...

    最简单的设计模式学习Singleton模式

    ### 最简单的设计模式学习:Singleton模式 #### 一、Singleton模式简介 Singleton(单例)模式是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在许多场合下非常...

    设计模式学习笔记

    设计模式的学习不仅帮助我们编写更可维护、可扩展的代码,还能提高团队间的沟通效率,因为它们提供了通用的语言和解决方案。在实际开发中,灵活运用这些设计模式可以有效解决设计问题,提升代码质量。因此,深入理解...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    在提供的"1.Singleton 单件(创建型模式).wmv"视频文件中,可能详细讲解了Singleton模式的概念、实现方式、优缺点以及在C#中的具体应用实例,包括如何在实际项目中适当地使用和避免滥用Singleton模式。观看该视频可以...

    [创建型模式] head first 设计模式之单件模式(Singleton)

    **单例模式(Singleton)**是软件设计模式中的一种创建型模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,例如管理共享资源、配置对象或者数据库连接等。单例...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    C#设计模式学习笔记

    C#设计模式学习笔记是一份详尽的资源,适合任何希望深入了解如何在C#编程中应用设计模式的开发者。这份笔记涵盖了多种设计模式,旨在提升代码的可读性、可维护性和可扩展性,这些都是软件开发中至关重要的要素。 ...

    设计模式C++学习之单例模式(Singleton)

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于...

    GOF之23种设计模式的C#实现:DesignPattern.zip

    在软件开发领域,设计模式是经过时间和实践验证的解决方案,用于解决常见的编程问题。"GOF之23种设计模式"是由四名作者——Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(通常称为Gang of Four,简称...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    设计模式复习题.doc

    7. 设计模式的应用领域: - 软件开发 - 系统设计 - 数据结构 - 算法设计 8. 设计模式的设计模式: - MVC 模式 - Proxy 模式 - Factory 模式 - Singleton 模式 - Observer 模式 9. 设计模式的常见问题: ...

Global site tag (gtag.js) - Google Analytics