单例模式
三个要点:
一.是某各类只能有一个实例
二.是它必须自行创建这个事例
三.是它必须自行向整个系统提供这个实例
如场景
对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印机服务程序,只应该有一个文件系统和一个窗口管理器。
一.饿汉式单例类
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(单例)模式是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在许多场合下非常...
Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。
设计模式概述与 Singleton 模式详解 在软件设计中,设计模式是解决问题的方案,学习现有的设计...Singleton 模式是创建型模式中的一种,通过学习 Singleton 模式,我们可以更好地理解创建型模式的设计思想和实现方式。
Singleton模式是一种设计模式,它是创建型模式的一种,用于控制类...通过分析和学习这段代码,我们可以更深入地理解Singleton模式的实现细节和在并发环境中的应用。同时,这也是一次了解和实践C++多线程编程的好机会。
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于...
通过对C++中单件模式的实现方式以及应用场景的学习,可以帮助开发者更好地理解和运用这一模式,从而提高代码的质量和效率。同时,需要注意的是,在实际开发中要根据具体情况选择合适的实现方式,合理运用单件模式,...
### JavaScript设计模式学习:Singleton模式 #### 一、Singleton模式简介 Singleton(单例)模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。这种模式通常用于控制...
单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。在Java编程中,实现单例模式有多种方式,其中包括静态常量、线程安全的同步方法、双重检查锁定(Double-...
在Laravel框架中,设计模式的应用是提升代码质量和可维护性的重要手段之一,而Singleton(单例模式...通过学习和实践`singleton-pattern-master`提供的示例,开发者可以深化对这一模式的理解,并将其应用于实际项目中。
通过阅读和理解这个文件,你可以深入学习Loki库的内部工作原理以及如何在实际项目中应用和测试单例模式。对于C++开发者来说,掌握像Loki这样的设计模式库是非常有益的,它能帮助你更高效地实现常见的设计模式,提高...
创建型模式包括Factory Method(工厂方法)、Abstract Factory(抽象工厂)、Builder(建造者)、Prototype(原型)、Singleton(单例)等。这些模式解决了对象的创建问题,提供了一种通用的解决方案。 结构型模式...
在SingletonTest Demo中,开发者可以学习如何在Objective-C中正确地实现和使用Singleton模式,同时理解其在实际开发中的作用和价值。通过运行和分析Demo,能加深对Singleton的理解,并提高解决实际问题的能力。 ###...
在学习和应用单例模式时,还需注意单例模式的扩展性和测试性问题。例如,单例类不应该被继承,否则每个子类都可以创建实例,这违背了单例模式的初衷。另外,在测试时,单例类往往难以进行单元测试,因为它们没有公共...
Singleton模式的核心思想是限制类的实例化,使得整个应用程序中只能存在一个该类的对象。这在需要全局共享资源或者协调多个组件时特别有用。例如,数据库连接池、线程池或配置管理器等都常采用Singleton模式。 实现...
Singleton模式是一种常用的软件设计模式,其核心思想是在Java应用程序中确保一个类只有一个实例,并提供全局访问点。Singleton模式通常有几种实现方式: 1. 第一种形式的Singleton模式,通过私有构造函数防止直接...
Singleton模式确保一个类只有一个实例,并提供全局访问点。在多线程环境中,正确实现单例模式需要考虑线程安全,防止多个线程同时创建实例。通常使用双重检查锁定(Double-Checked Locking)或静态内部类等方式实现...
1. 创建型模式(Creational Patterns):如单例模式(Singleton)、工厂模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。它们主要处理对象的创建,帮助...
Singleton模式在资源管理、日志系统、配置管理等场景中非常常见,因为它能保证在整个应用程序中只有一个共享的对象。 在实际编程中,Mediator和Singleton模式常常结合使用。比如,一个应用的配置管理器可以是一个...
这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory Method)和抽象工厂模式(Abstract Factory)。单例模式确保一个类只有一个实例,并提供全局访问点,常用于配置中心或者线程池等。工厂...