`
java虫
  • 浏览: 533306 次
  • 性别: 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模式

    C++完美实现Singleton模式

    C++完美实现Singleton模式,这个办法很经典,也很值得学习,时喜欢C++的朋友很好的学习资料。

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

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

    C#设计模式之Singleton模式

    主要介绍了C#设计模式中的Singleton模式相关知识,文中代码非常详细,供大家理解学习,感兴趣的朋友可以了解下

    JavaScript 设计模式学习 Singleton

    JavaScript设计模式学习 Singleton

    Python实现Singleton模式的方式详解

    主要介绍了Python实现Singleton模式的方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    singleton.zip

    单例模式的四种示例 静态常量 线程安全,同步方法 双重检查 静态内部类

    Singleton Pattern 源码

    提供简单易懂的单件设计模式源码,为你学习这种模式提供更好捷径.

    23种Python设计模式示例演示源码包.rar

    23种Python设计模式示例...Interpreter解释器模式,Iterator迭代器模式,Mediator中介者模式、Singleton光身汉模式,Observer观察者模式等,一共23种,这里不一一列举了,每一种模式代码,都包括了中文注解,利于学习。

    常见设计模式—单例模式(Singleton)

    单例模式(Singleton Pattern)是设计模式中最简单的模式之一,属于创建型模式。这种设计模式主要是类的对象只有一个实例,不需要每次new 创造。而我们要做的的就是确保这个对象创建的唯一。然后根据一些特征进行...

    结城浩《图解设计模式》笔记

    本笔记主要讲述了设计模式的基本概念和应用,包括 Iterator 模式、Adapter 模式、TemplateMethod 模式、FactoryMethod 模式和 Singleton 模式等。通过对这些设计模式的详细解释和示例代码的分析,我们可以更好地理解...

    设计模式_单例模式.zip

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 学习demo

    设计模式之创建型模式

    Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。 Factory Method, Abstract Factory, Builder都需要一个额外的工厂类来负责实例化“易变对象...

    面向对象初学者必须掌握的几种设计模式

    观察者模式 Observer:Swing中的事件模型 工厂模式 Factory:在JDK中遍地都是,比如JDBC、JNDI等,是学习Spring的基础 命令模式 Command:Struts框架的基石 单例模式 Singleton:最简单的设计模式,大量...

    学习php设计模式 php实现单例模式(singleton)

    Singleton 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类方法。负责创建它的唯一的实例。 三、单例模式的优点 1、对唯一实例的受控访问 2、缩小命名空间 单例模式是对全局变量的一种改进。它...

    研磨设计模式(完整带书签).part2.pdf

    也可以作为高效学生深入学习设计模式的参考读物! 第1章 设计模式基础 第2章 简单工厂 第3章 外观模式 第4章 适配器模式(Adapter) 第5章 单例模式(Singleton) 第6章 工厂方法模式(Factory Method) 第7章...

    Java面试 java设计模式整理 单例、工厂、策略等 面试使用,学习使用

    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章 设计模式回顾:总结与...

Global site tag (gtag.js) - Google Analytics