`

3中方式实现单例模式

阅读更多

实现 Singleton 模式的办法通常有三种.

一. 用静态方法实现 Singleton 这种方法是使用静态方法来监视实例的创建.为了防止创建一个以上的实例,我们最好把构造器声明为 private.

这样可以防止客户程序员通过除由我们提供的方法之外的任意方式来创建一个实例,如果不把构造器声明为private,编译器就会自作聪明的自动同步一个默认的friendly构造器.这种实现方法是最常见的,也就是图1中结构的标准实现.

public class Singleton {  
  private static Singleton s; 
  private Singleton(){};
  /**
   * Class method to access the singleton instance of the class.
   */
  public static Singleton getInstance() {
    if (s == null)
      s = new Singleton();
    return s;
  }
}
// 测试类
class singletonTest {
  public static void main(String[] args) {
    Singleton s1 = Singleton.getInstance();
    Singleton s2 = Singleton.getInstance();
    if (s1==s2)
      System.out.println("s1 is the same instance with s2");
    else
      System.out.println("s1 is not the same instance with s2");
  }
} 

 

singletonTest运行结果是:

s1 is the same instance with s2

这证明我们只创建了一个实例.

二. 以静态变量为标志实现 Singleton 在类中嵌入一个静态变量做为标志,每次都在进入构造器的时候进行检查.

问题在于构造器没有返回类型,如果确定创建一个实例成功与否.一个方法是调用一个函数来检查创建是否成功,然后简单的返回一个来自静态变量的值,但是这样做是不优雅的,而且容易发生错误.比较好的做法是创建一个当创建了一个以上的实例时可以抛出异常的类,这个类仅仅是调用父类方法,好处是用了自己命名的异常类型,错误信息更加清晰:

class SingletonException extends RuntimeException {
  public SingletonException(String s) {
    super(s);
  }
}
class Singleton {
  static boolean instance_flag = false; // true if 1 instance
  public Singleton() {
    if (instance_flag)
      throw new SingletonException("Only one instance allowed");
    else
      instance_flag = true; // set flag for 1 instance
  }
}
// 测试类
public class singletonTest {
  static public void main(String argv[]) {
    Singleton s1, s2;
    // create one incetance--this should always work
    System.out.println("Creating one instance");
    try {
      s1 = new Singleton();
    } catch (SingletonException e) {
      System.out.println(e.getMessage());
    }
    // try to create another spooler --should fail
    System.out.println("Creating two instance");
    try {
      s2 = new Singleton();
    } catch (SingletonException e) {
      System.out.println(e.getMessage());
    }
  }
} 

 

singletonTest运行结果是:

Creating one instance

Creating two instance

Only one instance allowed

可以看出,第一个实例顺利创建,第二个实例创建实抛出了我们自定义的异常.

三. 用注册器机制来创建 Singleton 首先用集合中的Hashtable 和Enumeration来实现addItem(Object key, Object value),getItem(Object key), ,removeItem(Object key)等方法实现一个管理器,将key和value一一关联起来,客户程序员创建实例前首先用addItem方法进行注册,再用getItem方法获取实例.Hashtable中的key是唯一的,从而保证创建的实例是唯一的,具体实现限于篇幅不再细说,在Prototype模型的应用一文中我将会给出一个实现注册器的代码.用注册器机制来创建 Singleton模式的好处是易于管理,可以同时控制多个不同类型的Singleton 实例.












分享到:
评论

相关推荐

    C# 实现单例模式

    一个用C#写的 实现单例模式的源码程序和大家分享交流一下

    单例模式各种实现方式

    在Java中,实现单例模式有多种方法,每种都有其特定的优缺点和适用场景。以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的...

    python使用装饰器(Decorator)的方式实现单例模式

    demo python使用装饰器(Decorator)的方式实现单例模式 functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module__、__name__、__doc__,或者通过参数选择

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    总结来说,单例模式在进程内保证对象的唯一性,但在分布式环境中需要额外的策略来实现跨进程的唯一性。线程唯一的单例则关注于在单个线程内的对象唯一,允许不同线程拥有各自的实例。在实际应用中,应根据系统的需求...

    在Python中实现单例模式.docx

    ### 在Python中实现单例模式 #### 概述 单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。在很多情况下,我们希望在整个应用程序中只存在一个特定类型的对象实例,例如配置管理...

    com_枚举方式实现单例模式_代码详解.rar

    本资料“com_枚举方式实现单例模式_代码详解.rar”提供了枚举方式实现单例模式的详细解读。 单例模式的核心在于控制类的实例化过程,防止多个实例的产生。传统的单例模式通常采用懒汉式或饿汉式来实现。懒汉式是在...

    Java实现多种单例模式

    每种单例模式都有其适用场景,开发者应根据实际需求选择合适的实现方式。例如,如果对性能有较高要求,可以考虑饿汉式;如果需要延迟初始化且考虑线程安全,双重校验锁是不错的选择;而在枚举单例中,由于其简洁性和...

    单例模式Java实现

    在Java中,我们可以使用多种方式来实现单例模式: 1. **饿汉式(静态常量)**:这是最简单的单例实现方式,它在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快,且线程安全。 ```java public class...

    C++实现的单例模式代码

    在C++中,实现单例模式通常涉及到内存管理、线程安全以及生命周期控制等问题。下面将详细探讨C++中实现单例模式的三种方法,以及在多线程环境下的考虑。 1. 静态成员变量法(单线程) 这是最简单的单例实现方式,...

    使用C++11实现线程安全的单例模式

    在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。线程安全的单例模式在多线程环境下尤其重要,因为不正确的实现可能导致多个线程创建多个实例,这违反了单例模式...

    设计模式单例模式和工厂模式综合应用

    在Java中,通常通过私有构造函数和静态工厂方法来实现单例。单例模式常用于控制共享资源,如线程池、数据库连接或者配置对象。其优点在于节省内存,减少对系统资源的消耗,同时保证了对象间的同步。 **工厂模式**是...

    c++单例模式线程日志类

    在C++中,通常通过私有构造函数和静态成员函数来实现单例。静态成员函数确保只有一个实例被创建,同时提供全局访问点。 日志类在此场景中的设计考虑了多线程安全。在多线程环境中,多个线程可能同时尝试写入日志,...

    设计模式之单例模式(结合工厂模式)

    静态内部类单例利用Java类加载机制保证了线程安全,而枚举单例则是Java中实现单例的最佳方式,因为它天然支持序列化且防止反射攻击。 在代码实现上,我们可以创建一个名为SingletonFactory的工厂类,其中包含一个...

    java单例模式实例

    在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...

    单例模式的要点及模式

    单例模式是软件设计模式中的一种经典模式,其核心思想在于限制类的实例化过程,确保在整个应用程序中只有一个实例存在。...在实际编程中,可以根据具体需求选择合适的实现方式,以及是否采用单例模式。

    通过javascript实现单例模式.rar

    在JavaScript中实现单例模式通常涉及使用一个对象字面量或创建一个包含实例的闭包。压缩包文件代码是一个使用JavaScript实现单例模式的简单示例。 在这个ES6的例子中,我们在构造函数内部检查了是否已经存在一个实例...

    单例模式代码实现

    这个讲的是单例模式的多种不同实现方式,希望对单例感兴趣的同学看看

    Java中的五种实现方法【单例模式】

    在实际开发中,根据项目需求和性能考虑,选择合适的方式实现单例模式。同时,随着Java技术的发展,枚举单例、基于依赖注入的单例等新型实现方式也逐渐流行,它们提供了更好的解决方案,避免了传统单例模式的一些问题...

    C++实现单例模式(懒汉式)源码

    在C++中,实现单例模式有多种方式,这里我们将聚焦于懒汉式(Lazy Initialization)的实现。懒汉式单例的特点是延迟初始化,即只有在第一次使用时才会创建实例,这有助于提高程序的运行效率。 一、懒汉式单例模式的...

Global site tag (gtag.js) - Google Analytics