单例模式
三个要点:
一.是某各类只能有一个实例
二.是它必须自行创建这个事例
三.是它必须自行向整个系统提供这个实例
如场景
对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印机服务程序,只应该有一个文件系统和一个窗口管理器。
一.饿汉式单例类
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模式
C++完美实现Singleton模式,这个办法很经典,也很值得学习,时喜欢C++的朋友很好的学习资料。
设计模式C++学习之单例模式(Singleton)
主要介绍了C#设计模式中的Singleton模式相关知识,文中代码非常详细,供大家理解学习,感兴趣的朋友可以了解下
JavaScript设计模式学习 Singleton
主要介绍了Python实现Singleton模式的方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
单例模式的四种示例 静态常量 线程安全,同步方法 双重检查 静态内部类
提供简单易懂的单件设计模式源码,为你学习这种模式提供更好捷径.
23种Python设计模式示例...Interpreter解释器模式,Iterator迭代器模式,Mediator中介者模式、Singleton光身汉模式,Observer观察者模式等,一共23种,这里不一一列举了,每一种模式代码,都包括了中文注解,利于学习。
单例模式(Singleton Pattern)是设计模式中最简单的模式之一,属于创建型模式。这种设计模式主要是类的对象只有一个实例,不需要每次new 创造。而我们要做的的就是确保这个对象创建的唯一。然后根据一些特征进行...
本笔记主要讲述了设计模式的基本概念和应用,包括 Iterator 模式、Adapter 模式、TemplateMethod 模式、FactoryMethod 模式和 Singleton 模式等。通过对这些设计模式的详细解释和示例代码的分析,我们可以更好地理解...
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 学习demo
Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。 Factory Method, Abstract Factory, Builder都需要一个额外的工厂类来负责实例化“易变对象...
观察者模式 Observer:Swing中的事件模型 工厂模式 Factory:在JDK中遍地都是,比如JDBC、JNDI等,是学习Spring的基础 命令模式 Command:Struts框架的基石 单例模式 Singleton:最简单的设计模式,大量...
Singleton 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类方法。负责创建它的唯一的实例。 三、单例模式的优点 1、对唯一实例的受控访问 2、缩小命名空间 单例模式是对全局变量的一种改进。它...
也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...
3. 单例模式(Singleton) 4 4.建造者模式(Builder) 4 5. 原型模式(Protype) 5 6.适配器模式(Adapter) 6 7.装饰模式(Decorator) 6 8.代理模式(Proxy) 7 9.外观模式(Facade) 7 10.桥接模式(Bridge) 7 ...
各种工厂模式 242 第21章 Singleton模式和Double-Checked Locking模式 249 第22章 Object Pool模式 257 第23章 Factory Method模式 267 第24章 工厂模式的总结 272 第八部分 终点与起点 第25章 设计模式回顾:总结与...