`
java虫
  • 浏览: 535921 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习Singleton模式

阅读更多
单例模式

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

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

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

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


三.登记式单例类
父类源码
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 需要父类的帮助才能实例化。

下面是子类的源代码。
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 曾指出,由于父类的实例必须存在才可能有子类的实例,这在有些情况下是一个浪费。

分享到:
评论

相关推荐

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

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

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

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

    设计模式.pdf_电子版_pdf版

    设计模式概述与 Singleton 模式详解 在软件设计中,设计模式是解决问题的方案,学习现有的设计...Singleton 模式是创建型模式中的一种,通过学习 Singleton 模式,我们可以更好地理解创建型模式的设计思想和实现方式。

    Singleton模式源程序

    Singleton模式是一种设计模式,它是创建型模式的一种,用于控制类...通过分析和学习这段代码,我们可以更深入地理解Singleton模式的实现细节和在并发环境中的应用。同时,这也是一次了解和实践C++多线程编程的好机会。

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

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

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

    通过对C++中单件模式的实现方式以及应用场景的学习,可以帮助开发者更好地理解和运用这一模式,从而提高代码的质量和效率。同时,需要注意的是,在实际开发中要根据具体情况选择合适的实现方式,合理运用单件模式,...

    JavaScript 设计模式学习 Singleton

    ### JavaScript设计模式学习:Singleton模式 #### 一、Singleton模式简介 Singleton(单例)模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这种模式通常用于控制...

    singleton.zip

    单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。在Java编程中,实现单例模式有多种方式,其中包括静态常量、线程安全的同步方法、双重检查锁定(Double-...

    Laravel开发-singleton-pattern

    在Laravel框架中,设计模式的应用是提升代码质量和可维护性的重要手段之一,而Singleton(单例模式...通过学习和实践`singleton-pattern-master`提供的示例,开发者可以深化对这一模式的理解,并将其应用于实际项目中。

    Loki singleton

    通过阅读和理解这个文件,你可以深入学习Loki库的内部工作原理以及如何在实际项目中应用和测试单例模式。对于C++开发者来说,掌握像Loki这样的设计模式库是非常有益的,它能帮助你更高效地实现常见的设计模式,提高...

    设计模式1-创建型模式

    创建型模式包括Factory Method(工厂方法)、Abstract Factory(抽象工厂)、Builder(建造者)、Prototype(原型)、Singleton(单例)等。这些模式解决了对象的创建问题,提供了一种通用的解决方案。 结构型模式...

    SingletonTest Demo代码

    在SingletonTest Demo中,开发者可以学习如何在Objective-C中正确地实现和使用Singleton模式,同时理解其在实际开发中的作用和价值。通过运行和分析Demo,能加深对Singleton的理解,并提高解决实际问题的能力。 ###...

    单例模式(Singleton)的6种实现

    在学习和应用单例模式时,还需注意单例模式的扩展性和测试性问题。例如,单例类不应该被继承,否则每个子类都可以创建实例,这违背了单例模式的初衷。另外,在测试时,单例类往往难以进行单元测试,因为它们没有公共...

    C#面向对象设计模式纵横谈2

    Singleton模式的核心思想是限制类的实例化,使得整个应用程序中只能存在一个该类的对象。这在需要全局共享资源或者协调多个组件时特别有用。例如,数据库连接池、线程池或配置管理器等都常采用Singleton模式。 实现...

    singleton、回调函数、sizeof等小结.docx

    Singleton模式是一种常用的软件设计模式,其核心思想是在Java应用程序中确保一个类只有一个实例,并提供全局访问点。Singleton模式通常有几种实现方式: 1. 第一种形式的Singleton模式,通过私有构造函数防止直接...

    设计模式学习笔记大全

    Singleton模式确保一个类只有一个实例,并提供全局访问点。在多线程环境中,正确实现单例模式需要考虑线程安全,防止多个线程同时创建实例。通常使用双重检查锁定(Double-Checked Locking)或静态内部类等方式实现...

    java设计模式中英文各种版本打包下载 学习设计模式必备材料

    1. 创建型模式(Creational Patterns):如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。它们主要处理对象的创建,帮助...

    C++ 设计模式

    Singleton模式在资源管理、日志系统、配置管理等场景中非常常见,因为它能保证在整个应用程序中只有一个共享的对象。 在实际编程中,Mediator和Singleton模式常常结合使用。比如,一个应用的配置管理器可以是一个...

    设计模式之美—学习笔记

    这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory Method)和抽象工厂模式(Abstract Factory)。单例模式确保一个类只有一个实例,并提供全局访问点,常用于配置中心或者线程池等。工厂...

Global site tag (gtag.js) - Google Analytics