`
songjindian
  • 浏览: 75612 次
  • 性别: Icon_minigender_1
  • 来自: 河南
文章分类
社区版块
存档分类
最新评论

Singleton 模式

阅读更多
学习Singleton模式
单例模式

三个要点:
一.是某各类只能有一个实例
二.是它必须自行创建这个事例
三.是它必须自行向整个系统提供这个实例

如场景
  对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印机服务程序,只应该有一个文件系统和一个窗口管理器。

一.饿汉式单例类
Java代码
public class EagerSingleton   
{   
// 在这个类被加载时,静态变量m_instance 会被初始化,此时类的私有构造子会调  
//用。这时候,单例类的惟一实例就被创建出来了。  
private static final EagerSingleton m_instance = new EagerSingleton();   
/**  
* 私有的默认构造子  
*/   
private EagerSingleton() { }   
/**  
* 静态工厂方法  
*/   
public static EagerSingleton getInstance()   
{  
  return m_instance;   
}  

  Java 语言中单例类的一个最重要的特点是类的构造子是私有的,从而避免外界利用构造子直接创建出任意多的实例。值得指出的是,由于构造子是私有的,因此,此类不能被继承。


二.懒汉式单例类
Java代码
package com.javapatterns.singleton.demos;   
public class LazySingleton   
{   
private static LazySingleton m_instance = null;   
/**  
* 私有的默认构造子,保证外界无法直接实例化  
*/   
private LazySingleton() { }   
 
// 与饿汉式单例类不同的是,懒汉式单例类在第一次被引用时将自己实例化。如果加载  
//器是静态的,那么在懒汉式单例类被加载时不会将自己实例化  
synchronized public static LazySingleton getInstance()   
{   
if (m_instance == null)   
{  
   m_instance = new LazySingleton();   
}   
  return m_instance;   
}  

1)同样,由于构造子是私有的,因此,此类不能被继承。

2)饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。

3)从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时, 必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。


三.登记式单例类
父类源码
Java代码
import java.util.HashMap;   
public class RegSingleton   
{   
static private HashMap m_registry = new HashMap();   
static   
{   
//饿汉式  
RegSingleton x = new RegSingleton();   
m_registry.put( x.getClass().getName() , x);   
}   
/**  
* 保护的默认构造子  
*/   
protected RegSingleton() {}   
/**  
* 静态工厂方法,返还此类惟一的实例  
*/   
static public RegSingleton getInstance(String name)   
{   
if (name == null)   
{   
name = "com.javapatterns.singleton.demos.RegSingleton";   
}   
if (m_registry.get(name) == null)   
{   
try   
{   
m_registry.put( name,   
Class.forName(name).newInstance() ) ;   
}   
catch(Exception e)   
{   
System.out.println("Error happened.");   
}   
}   
return (RegSingleton) (m_registry.get(name) );   
}   
/**  
* 一个示意性的商业方法  
*/   
public String about()   
{   
return "Hello, I am RegSingleton.";   
}  
}  
它的子类RegSingletonChild 需要父类的帮助才能实例化。

下面是子类的源代码。
Java代码
import java.util.HashMap;   
public class RegSingletonChild extends RegSingleton   
{   
public RegSingletonChild() {}   
/**  
* 静态工厂方法  
*/ 
//懒汉式  
static public RegSingletonChild getInstance()   
{   
return (RegSingletonChild)   
RegSingleton.getInstance(   
"com.javapatterns.singleton.demos.RegSingletonChild" );   
}   
/**  
* 一个示意性的商业方法  
*/   
public String about()   
{   
return "Hello, I am RegSingletonChild.";   


  在GoF 原始的例子中,并没有getInstance() 方法,这样得到子类必须调用的getInstance(String name)方法并传入子类的名字,因此很不方便。现在在登记式单例类子类的例子里,加入了getInstance() 方法.

这样做的好处是
RegSingletonChild 可以通过这个方法,返还自已的实例。

而这样做的缺点是
1)由于数据类型不同,无法在RegSingleton 提供这样一个方法。由于子类必须允许父类以构造子调用产生实例,因此,它的构造子必须是公开的。这样一来,就等于允许了以这样方式产生实例而不在父类的登记中。

2)GoF 曾指出,由于父类的实例必须存在才可能有子类的实例,这在有些情况下是一个浪费。
分享到:
评论

相关推荐

    C++完美实现Singleton模式

    ### C++中实现Singleton模式的关键知识点 #### 一、Singleton模式简介 Singleton模式是一种常用的软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中经常被用于控制对共享资源...

    C++ 实现的singleton 模式

    **C++实现的Singleton模式详解** Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源,如数据库连接池,或者确保某个...

    Java的Singleton模式代码(免资源分)

    ### Java的Singleton模式详解 #### 一、Singleton模式概述 Singleton模式是一种常用的设计模式,在Java中主要用于确保一个类只有一个实例,并提供一个全局访问点。这种模式对于管理共享资源(如数据库连接池、...

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

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

    (创建型模式)Singleton模式

    Singleton模式是设计模式中的一种创建型模式,它在软件工程中扮演着重要的角色。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。Singleton模式的应用场景通常涉及到系统...

    设计模式 创建型模式 Singleton模式(单键)

    Singleton模式: 确保一个类只有唯一的一个实例。 Singleton主要用于对象的创建,这意味着,如果某个类采用了Singleton模式,则在这个类被创建后,它将有且仅有一个实例可供访问。很多时候我们都会需要Singleton...

    Singleton模式源程序

    Singleton模式是一种设计模式,它是创建型模式的一种,用于控制类的实例化过程,确保一个类在整个应用程序中只有一个实例存在。这种模式在系统中需要频繁创建和销毁对象,且对象需要共享资源时非常有用,比如配置...

    C#设计模式之Singleton模式

    《C#设计模式之Singleton模式详解》 Singleton模式是软件设计模式中的一种基础模式,它在众多设计模式中占有重要地位,尤其在C#编程中经常被应用。Singleton模式的主要目的是确保一个类只有一个实例,并提供一个...

    Java线程安全的Singleton模式:深入分析与实现

    在Java编程中,Singleton模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。线程安全的Singleton模式对于多线程环境尤为重要,因为它可以防止多个线程同时创建多个实例。本文将详细介绍...

    Singleton模式

    Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这个模式在许多场景下非常有用,比如配置管理、日志服务、线程池等,需要确保全系统内只有一个对象来处理特定任务的情况...

    深入浅出单例Singleton模式

    【深入浅出单例Singleton模式】 单例模式是一种在软件设计中常见的设计模式,它的核心目标是确保一个类只有一个实例,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于控制资源的共享,如全局...

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

    这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...

    C++CLI中实现singleton模式

    双重检测锁(Double-Checked Locking)实现的Singleton模式在多线程应用中有相当的价值。在ACE的实现中就大量使用ACE_Singleton模板类将普通类转换成具有Singleton行为的类。这种方式很好地消除了一些重复代码臭味,...

    Qt qml Singleton 单例模式

    综上所述,Qt Qml的Singleton模式为全局共享对象提供了方便,使得在Qml环境中管理和访问同一对象变得简单。通过C++和Qml的有效结合,我们可以构建出高效且易于维护的应用程序。了解和熟练运用Singleton模式,对于...

    singleton设计模式java实现及对比

    在Java中,Singleton模式的实现有多种方式,每种方式都有其优缺点,我们将详细探讨这些实现方法并进行对比。 ### 1. 饿汉式(Static Final Field) 这是最简单的Singleton实现方式,通过静态初始化器在类加载时就...

    java Singleton单例模式

    接下来,我们将深入探讨Java Singleton模式的实现方式、优缺点以及使用场景。 一、Singleton模式的实现 1. 饿汉式(静态常量) ```java public class Singleton { private static final Singleton INSTANCE = ...

    Java设计模式之单态模式(Singleton模式)介绍

    单态模式(Singleton模式)是Java设计模式中的一种,它的主要目标是确保一个类在整个应用程序中只有一个实例存在。这种模式的应用场景广泛,特别是在需要全局共享的资源管理、配置中心、日志服务等场合非常常见。 ...

Global site tag (gtag.js) - Google Analytics