`
Fis
  • 浏览: 87352 次
  • 性别: Icon_minigender_1
  • 来自: 龙城
社区版块
存档分类
最新评论

Design Pattern: Singleton 模式

阅读更多
  Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance)。
  很多时候,您会需要Singleton模式,例如印表机管理,您希望程式中只能有一个Print Spooler,以避免两个列印动作同时输入至印表机中;例如资料库管理,因为建立连接(Connection)物件会耗用资源,您希望程式中只能有一个连接物件,所有其它的程式都透过这个物件来连接资料库,以避免连接物件的重复开启造成资源的耗用;例如系统程式属性档的读取,您使用单一个物件来读取属性内容,而程式的其它部份都向这个物件要求属性资料,而不是自行读取属性资料。
  以印表机设计为例,有的设计人员会采取全域变数的方式来建立实例,并在程式中随机取用这个实例,Java虽然不支援全域变数,但透过将物件包装在一个类别之中,也有人会采用这样的写法:
    public class PrintSpooler {
        public PrintSpooler() {
            // ....
        }

        public Connection getSpooler(){
           ....
        }
    }

    public class GlobalObject {
        private PrintSpooler printSpooler;
        public GlobalObject () {
            printSpooler = new PrintSpooler();
            ...
        }
       
        public void getPrintSpooler() {
            return printSpooler;
        }
    }

  无论全域变数或是以上的例子,都无法保证只产生唯一个实例,您也许会注意不犯这个错误,但与您共同工作的伙伴也许会直觉的使用建构方法来产生一个 PrintSpooler实例。
  Singleton模式可以保证一个类别只有一个实例,并提供一个访问(visit)这个实例的方法。
  一个Singleton实作即为Java中的java.lang.Runtime类别,每个Java程式执行时都有一个唯一的Runtime物件,可以透过它提供的静态方法getRuntime()方法来取得这个物件,例如:

Runtime runtime = Runtime.getRuntime();

  取得Runtime物件之后,您可以透过它进行一些外部命令的执行、进行垃圾处理等等指令,您可以开启Runtime.java类别,开头的几行是这样写的:
    public class Runtime {
        private static Runtime currentRuntime = new Runtime();

        public static Runtime getRuntime() {
            return currentRuntime;
        }

       /** Don't let anyone else instantiate this class */
       private Runtime() {}

        // 以下略
    }

  上面结构即采用Singleton模式设计,其结构使用 UML 来表即如下所示:
singleton-1.jpg


  如上所示的,Java使用 静态工厂 来取得Runtime物件,其中Runtime的建构函式被宣告为private,这样可以阻止其他人使用建构方法来建立实例;使用更一般化的表示单例的UML结构,如下图所示:
singleton-2.jpg



  有几个实作上面结构的方法,可以在第一次需要实例时再建立物件,也就是采用所谓的Lazy Initialization:
    public class Singleton {
        private static Singleton instance = null;

        private Singleton() {
            // ....
        }

        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }

            return instance;
        }

        // .. 其它实作
    }

上面的实作适用于单执行绪的程式,在多执行绪的程式下,以下的写法在多个执行绪的竞争资源下,将仍有可能产生两个以上的实例,例如下面的情况:
    Thread1: if(instance == null) // true
    Thread2: if(instance == null) // true

    Thread1: instance = new Singleton(); // 产生一个实例
    Thread2: instance = new Singleton(); // 又产生一个实例

    Thread1: return instance; // 回传一个实例
    Thread2: return instance; // 又回传一个实例

在多执行绪的环境下,为了避免资源同时竞争而导致如上产生多个实例的情况,加上同步(synchronized)机制:
    public class Singleton {
        private static Singleton instance = null;
        private Singleton(){}
        synchronized static public Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }

  不过这种简单的写法不适合用于像伺服器这种服务很多执行绪的程式上,同步机制会造成相当的效能低落,为了顾及Singleton、Lazy Initialization与效能问题,因而有了Double-check Locking的模式:
    public class Singleton {
        private static Singleton instance = null;
        private Singleton(){}
        public static Singleton getInstance() {
            if (instance == null){
                synchronized(Singleton.class){
                    if(instance == null) {
                         instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }

Java中Runtime类别的作法就简单多了,它舍弃了Lazy Initialization,如果您的实例初始化不是很久的话,可以用这种方式:
    public class Singleton {
        private static Singleton instance = new Singleton();

        private Singleton() {
            // ....
        }

        public static Singleton getInstance() {
            return instance;
        }

        // 其它实作
    }

Singleton本身的观念简单但应用很广,因而很多时候必须对实际环境作一些考量与调整,建议您也看看有关于Singleton的这篇 讨论。
  • 大小: 10 KB
  • 大小: 10.3 KB
分享到:
评论

相关推荐

    DesignPattern:设计模式样本

    "DesignPattern:设计模式样本"这个项目可能包含了各种设计模式的实现示例,特别是对Java中的Singleton模式进行了深入探讨。 Singleton模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。...

    DesignPattern:设计模式小Demo

    设计模式是软件工程中的一种最佳实践,用于解决在软件设计中常见的...以上就是这个DesignPattern小Demo中可能会涵盖的设计模式,通过这些模式的实例,你可以更好地理解和应用它们到实际项目中,提升你的Java编程能力。

    DesignPattern::pencil:设计模式_java实现以及详解

    本资源“DesignPattern::pencil:设计模式_java实现以及详解”提供了一套详细的学习材料,帮助开发者理解和应用设计模式。 该资源的作者是“养码青年-Style”,他通过这个项目记录了自己的设计模式学习过程。鼓励...

    DesignPattern:设计模式

    DesignPattern-master这个压缩包可能包含了一个关于设计模式的项目或者教程资源。 设计模式分为三类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)...

    designPattern:设计模式相关代码实现

    "designPattern:设计模式相关代码实现"这个项目,显然提供了不同设计模式在Java语言中的实际应用示例。 在Java世界里,设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。每种模式都针对特定的编程问题...

    DesignPattern:设计模式.net源代码

    本资源"DesignPattern:设计模式.net源代码"提供了一套基于.NET实现的设计模式示例,旨在帮助程序员更好地理解和应用这些模式。 在"DesignPattern-master"这个压缩包中,你可能找到的文件结构和内容包括: 1. **...

    DesignPattern:设计模式演示程序

    这个名为"DesignPattern"的压缩包文件很可能包含了一个Java实现的各种设计模式的示例程序。 在这个"DesignPattern-master"目录中,我们可以期待找到一系列与设计模式相关的Java源代码文件(.java),每个文件或...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...

    DesignPattern:C#设计模式示例

    "DesignPattern:C#设计模式示例"这个资源很可能是包含多个C#实现的设计模式示例代码库。 设计模式通常分为三类:创建型、结构型和行为型。每种模式都解决了特定场景下的问题,并提供了良好的代码组织和扩展性。 ...

    design pattern

    在给定的压缩包文件中,包含了九种经典的设计模式示例,它们分别是:单例模式(Singleton)、策略模式(StrategyPattern)、适配器模式(AdapterPattern)、装饰者模式(DecoratorPattern)、抽象工厂模式...

    FOAD-DesignPattern:FOAD-DesignPattern

    2. 单例模式(Singleton Pattern): 单例模式确保一个类只有一个实例,并提供一个全局访问点。在C#中,通常通过私有构造函数和静态方法来实现单例,确保类的唯一性。单例模式常用于控制资源的共享,如数据库连接、...

    设计模式源码Head_First_DesignPattern_src

    在本文中,我们将深入探讨设计模式的核心概念,并结合"Head First DesignPattern_src"中的源码,详细解析一些关键的设计模式。 1. 单例模式(Singleton): 单例模式确保一个类只有一个实例,并提供全局访问点。在...

    DesignPattern:设计模式的学习笔记和示例代码

    设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的经验总结。...在DesignPattern-master这个压缩包中,你可以找到关于这些模式的详细讲解和实例代码,为你的Java开发之旅提供宝贵的参考资料。

    DesignPattern:有关设计模式的一些演示

    这个名为"DesignPattern:有关设计模式的一些演示"的项目,可能是为了帮助开发者理解和应用各种设计模式。 设计模式分为三大类:创建型、结构型和行为型。创建型模式关注对象的创建过程,如单例(Singleton)、工厂...

    designpattern:Head First 设计模式练习

    首先,我们来看单例模式(Singleton),它是确保一个类只有一个实例并提供一个全局访问点的模式。在Java中,通常通过私有构造函数和静态工厂方法实现单例。例如: ```java public class Singleton { private ...

    C++ 实现的singleton 模式

    Singleton* Singleton::instance = nullptr; // getInstance()方法,检查并创建唯一实例 Singleton* Singleton::getInstance() { if (instance == nullptr) { instance = new Singleton(); } return instance; ...

    Design*Pattern*Framework*4.5

    "Design*Pattern*Framework*4.5" 可能指的是一个基于 .NET Framework 4.5 的设计模式实现或教程集合。 设计模式是经验丰富的软件开发者的智慧结晶,它们被分为三类:创建型、结构型和行为型。创建型模式涉及对象的...

    Design-pattern:设计模式

    这个名为"Design-pattern:设计模式"的压缩包可能包含了一个关于设计模式的学习资源,比如代码示例或者教程。 创建型设计模式是设计模式中的一个类别,主要关注对象的创建过程。这类模式包括工厂方法(Factory ...

    design pattern tutorial

    3. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。单例模式是设计模式中最简单但又非常重要的模式之一。 4. 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离...

Global site tag (gtag.js) - Google Analytics