Design Pattern: Registry of Singleton 模式

一句话概括:您可以使用父类别来统一管理多个继承的子类别之Singleton实例,您可以在需要的时候再向父类别注册子类 Singleton,必要时随时调整传回的子类别Singleton。

考虑使用 Singleton 模式 时拥有子类别的问题,在Singleton模式中的getInstance()通常是一个静态方法,不能在子类别中重新定义它,关于子类别实例的产生交由getInstance()来进行是最好的选择,例如:

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {
        // ....
    }

    public static Singleton getInstance() {
        if (instance == null) {
            // getEnv表示系统环境变数
            String style = getEnv("style"); 

            if (style.equals("child1"))
                instance = new ChildSingleton1();
            else if (style.equals("child2r"))
                instance = new ChildSingleton2();
            else
                instance = new Singleton();
        }

        return _instance;
    }

    // ....
}

上面这个程式片段改写自 Gof 书中关于Singleton的例子,并用Java实现;在书中指出,这个例子的缺点是每增加一个子类别,getInstance()就必须重新修改,这个问题在Java中可以使用Reflection机制来解决:

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {
        // ....
    }

    public static Singleton getInstance() {
        if (instance == null) {
            // getEnv表示环境变数
            String style = getEnv("style");

            try {
                instance = (Singleton)
                          Class.forName(style).newInstance();
            }
            catch(Exception e) {
                System.out.println(
                   "Sorry! No such class defined!");
            }
        }

        return instance;
    }

    // ....
}

上面的方式使用了Java的Reflection机制,并透过环境变数设定要产生的子类Singleton,如果不使用Reflection的话,Gof 书中提出的改进方法是使用Registry of Singleton方法:

import java.util.*;

public class Singleton {
    // 注册表,用于注册子类别物件
    private static Map registry = new HashMap();
    private static Singleton instance;

    public static void register(
                 String name, Singleton singleton) {
        registry.put(name, singleton);
    }

    public static Singleton getInstance() {
        if (instance == null) {
            // getEnv表示取得环境变数
            String style = getEnv("style");
            instance = lookup(style);
        }

        return instance;
    }

    protected static Singleton lookup(String name) {
        return (Singleton) registry.get(name);
    }
}

在Gof书中使用List来实现注册表,而在这边使用HasMap类别来实现,它是由Java SE所提供的;在父类别中提供一个register() 以注册Singleton的子类别所产生之实例,而注册的时机可以放在子类别的建构方法中加以实现,例如:

public class ChildSingleton1 extends Singleton {
    public ChildSingleton1() {
        // ....
        // 注册子类别物件
        register(getClass().getName(), this);
    }
}

若要利用Singleton,则先使用这个子类别产生物件,这会向父类别注册物件,之后透过Singleton父类别来取得物件:

// 必须先启始这段注册程序 
// 产生并注册ChildSingleton1物件 
new ChildSingleton1(); 
// 产生并注册ChildSingleton2物件 
new ChildSingleton2();

// 注册完成,可以使用父类别来取得子类的Singleton 
// 至于取回何哪一个,视您的环境变数设置决定 
Singleton childSingleton = Singleton.getInstance();

这种方式的缺点是您必须在程式中启始一段程序,先向父类别注册子类的Singleton,之后才能透过父类别来取得指定的子类别Singleton实例, 好处是可以适用于没有Reflection机制的语言,如果您想要改变Singleton父类传回的子类Singleton,可以在上面的 Singleton类别中加入一个reset()方法,将instance设定为null,然后重新设定环境变数,之后再利用 Singleton父类的getInstance()方法重新取得注册表中的其它子类。 
事实上Registry of Singleton的真正优点正在于此,您可以使用父类别来统一管理多个继承的子类别之Singleton实例,您可以在需要的时候再向父类别注册子类 Singleton,必要时随时调整传回的子类别Singleton。

时间: 2024-10-25 20:41:11

Design Pattern: Registry of Singleton 模式的相关文章

Design Pattern: Singleton 模式

一句话概括:保证一个类仅有一个实例,并提供一个访问它的全局访问点. Singleton的英文意义是独身,也就是只有一个人,应用在物件导向语言上,通常翻译作单例:单一个实例(Instance).  很多时候,您会需要Singleton模式,例如印表机管理,您希望程式中只能有一个Print Spooler,以避免两个列印动作同时输入至印表机中:例如资料库管理,因为建立连接(Connection)物件会耗用资源,您希望程式中只能有一个 连接物件,所有其它的程式都透过这个物件来连接资料库,以避免连接物件

Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

   Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中透露的Monad重要性则不言而喻.Scalaz是通过Monad typeclass为数据运算的程序提供了一套规范的编程方式,如常见的for-comprehension.而不同类型的Monad实例则会支持不同的程序运算行为,如:Option Monad在运算中如果遇到None值则会中途退出:St

Design Pattern: Prototype 模式

  学习是分享和合作式的! 转载请注明出处:http://blog.csdn.net/wdzxl198/article/details/9271773: 文章摘自: http://www.riabook.cn/doc/designpattern/: 您从图书馆的期刊从发现了几篇您感兴趣的文章,由于这是图书馆的书,您不可以直接在书中作记号或写字,所以您将当中您所感兴趣的几个主题影印出来,这下子您就可在影印的文章上画记重点. Prototype模式的作用有些类似上面的描述,您在父类别中定义一个clo

singleton模式

或许最简单的设计范式就是"单子"(Singleton),它能提供对象的一个(而且只有一个)实例.单子在Java库中得到了应用,但下面这个例子显得更直接一些:   //: SingletonPattern.java // The Singleton design pattern: you can // never instantiate more than one. package c16; // Since this isn't inherited from a Cloneable /

Rational:基于Design Pattern Toolkit的开发

1 内容简介 设计模式工具箱(Design Pattern Toolkit)是基于Eclipse的模板引擎,它向用户提供一个模型驱动 的框架,帮助用户简化应用程序的开发.用户通过模板定制应用程序的必要信息,设计模式工具箱帮助用 户自动生成应用程序的所有构件.使用设计模式工具箱将显著的加速常见应用程序的开发,与此同时,设 计模式工具箱向用户提供了构建一类应用程序的最佳实践,因此,使用它将帮助用户分享最佳实践的价值 . 本文首先介绍设计模式的基本概念,然后介绍设计模式工具箱(Design Patte

java Singleton模式

Java Singleton 模式用来保证在运行的应用程序中,一个Class只是实例化一次,也就是只有一个相应的对象存在.在 web 程序中我们会用一个核心的分配功能的Servlet程序,在这里我们就可以运用这种设计模式了.一般Singleton模式通常有几种种形式:第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法.public clas

C++/CLI中实现singleton模式

双重检测锁(Double-Checked Locking)实现的Singleton模式在多线程应用中有相当的价值.在ACE的实现中就大量使用ACE_Singleton模板类将普通类转换成具有Singleton行为的类.这种方式很好地消除了一些重复代码臭味,而且,优化后的性能较标准互斥版本提高15倍.最近在用C++/CLI做一些工作,Singleton不可避免地需要用到,于是我又制造了一次车轮. 1 #pragma once2 3 /** \class sidle::Singleton4 \bri

设计模式的解析和实现(C++)之五-Singleton模式

作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点. UML结构图: 解析: Singleton模式其实是对全局静态变量的一个取代策略,上面提到的Singleton模式的两个作用在C++中是通过如下的机制实现的:1)仅有一个实例,提供一个类的静态成员变量,大家知道类的静态成员变量对于一个类的所有对象而言是惟一的 2)提供一个访问它的全局访问点,也就是提供对应的访问这个静态成员变量的静态成员函数,对类的所有对象而言也是惟一的.在C++中,可以直接使用类域进行访问而不必初始化一个类的对象.

设计模式学习笔记(九)—Singleton模式

<设计模式>一书对Singleton模式是这样描述的: 保证一个类只有一个实例,并提供一个访问它的全局访问点. 这个模式比较简单,下面给出一个例子: public class Singleton { private static Singleton instance; private Singleton(){ } public static Singleton getInstance(){ if(instance==null) instance=new Singleton(); return