- 浏览: 141401 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
nishwd123:
受益匪浅,多谢楼主细心讲解.
Hibernate、Spring和Struts工作原理及使用理由 -
doublelcf:
写得真好。全面,流畅。清晰
Hibernate、Spring和Struts工作原理及使用理由
1 饿汉式单例类.在类初始化时,已经自行实例化
class EagerSingleton {
private static final EagerSingleton m_instance = new EagerSingleton();
/** * 私有的默认构造子 */
private EagerSingleton() {
}
/**
* * 静态工厂方法
*/
public static EagerSingleton getInstance() {
return m_instance;
}
}
2 懒汉式单例类.在第一次调用的时候实例化
class LazySingleton {
// 注意,这里没有final
private static LazySingleton m_instance = null;
/** * 私有的默认构造子 */
private LazySingleton() {
}
/**
* * 静态工厂方法
*/
public synchronized static LazySingleton getInstance() {
if (m_instance == null) {
m_instance = new LazySingleton();
}
return m_instance;
}
}
在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里
建议使用所谓的"双重检查成例".必须指出的是,"双重检查成例"不可以在Java 语言中使用。不十分熟
悉的读者,可以看看后面给出的小节。
同样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例
化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,
这个比懒汉式单例类稍差些。
从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,必须处
理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必
然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变
得较大。
饿汉式单例类可以在Java 语言内实现, 但不易在C++ 内实现,因为静态初始化在C++ 里没有固定
的顺序,因而静态的m_instance 变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么
GoF 在提出单例类的概念时,举的例子是懒汉式的。他们的书影响之大,以致Java 语言中单例类的例子
也大多是懒汉式的。实际上,本书认为饿汉式单例类更符合Java 语言本身的特点。
3 登记式单例类.类似Spring里面的方法,将类名注册,下次从里面直接获取。 查看复制到剪切板打印
import java.util.HashMap;
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 = RegSingleton.class.getName();
}
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));
}
return null;
}
/** * 一个示意性的商业方法 */
public String about() {
return "Hello, I am RegSingleton.";
}
}
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.";
}
}
class EagerSingleton {
private static final EagerSingleton m_instance = new EagerSingleton();
/** * 私有的默认构造子 */
private EagerSingleton() {
}
/**
* * 静态工厂方法
*/
public static EagerSingleton getInstance() {
return m_instance;
}
}
2 懒汉式单例类.在第一次调用的时候实例化
class LazySingleton {
// 注意,这里没有final
private static LazySingleton m_instance = null;
/** * 私有的默认构造子 */
private LazySingleton() {
}
/**
* * 静态工厂方法
*/
public synchronized static LazySingleton getInstance() {
if (m_instance == null) {
m_instance = new LazySingleton();
}
return m_instance;
}
}
在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里
建议使用所谓的"双重检查成例".必须指出的是,"双重检查成例"不可以在Java 语言中使用。不十分熟
悉的读者,可以看看后面给出的小节。
同样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例
化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,
这个比懒汉式单例类稍差些。
从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,必须处
理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必
然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变
得较大。
饿汉式单例类可以在Java 语言内实现, 但不易在C++ 内实现,因为静态初始化在C++ 里没有固定
的顺序,因而静态的m_instance 变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么
GoF 在提出单例类的概念时,举的例子是懒汉式的。他们的书影响之大,以致Java 语言中单例类的例子
也大多是懒汉式的。实际上,本书认为饿汉式单例类更符合Java 语言本身的特点。
3 登记式单例类.类似Spring里面的方法,将类名注册,下次从里面直接获取。 查看复制到剪切板打印
import java.util.HashMap;
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 = RegSingleton.class.getName();
}
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));
}
return null;
}
/** * 一个示意性的商业方法 */
public String about() {
return "Hello, I am RegSingleton.";
}
}
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.";
}
}
发表评论
-
Java中serialVersionUID
2012-11-26 13:27 872Java中serialVersionUID serialV ... -
ArrayList数组对象排序
2012-11-13 21:53 1457POJO package com.test.compara ... -
Java堆和栈的区别 equals 和 == 的区别
2012-11-07 12:10 838Java堆和栈的区别 equals ... -
Cookie,Session,Application用法及区别
2012-05-22 15:20 2852一.Cookie 首先,Cookie的作用域为 ... -
static 的用法
2012-05-22 13:58 923static 代码块应用 package com.ut ... -
finally解析
2012-05-22 13:47 976一.finally 中的语句什么 ... -
java 断言 assert 初步使用:断言开启、断言使用
2012-05-04 20:43 1565java 断言 assert 初步使用:断言开启、断言使用 ... -
java 定时任务实现
2012-04-05 22:41 3694java.util.Timer定时器,实际上是个线程,定时调度 ... -
Servlet上传文件,commons-fileupload
2012-03-02 11:17 4847Servlet上传文件,commons-fil ... -
堆与栈的区别
2012-02-24 11:58 964堆和栈的区别 全局,静态,new产生的变量都在堆中动态分 ... -
在Java中用单例模式有什么好处
2012-01-30 19:46 1346Java Singleton模式主要作 ... -
jsp中的注释<!-- -->内容中不能包含--
2011-11-23 17:45 940jsp中的注释<!-- -->内容中不能包含-- ... -
ibatis和hibernate的区别
2011-08-15 13:34 653ibatis和hibernate的区别 ... -
equals和"=="浅析
2011-02-24 22:30 827==操作符专门用来比较 ... -
java中的重写与重载
2011-02-21 13:59 904方法的重写Overriding和重载Overloading是J ... -
MyEclipse生成WAR包并在Tomcat下部署发布
2011-02-18 22:56 2291右键选中项目,选择export。 然后选择J2EE-> ... -
JPA详解
2011-02-17 08:54 2044JPA全称Java Persistence API.JPA通过 ... -
comparable和comparator的区别
2011-02-16 17:59 1241两者区别: 1) Comparable接 ... -
Freemarker网站静态化实现
2011-02-15 14:26 1078转载自http://www.iteye.com/topic/4 ... -
jdk1.5之后新特性总结
2011-02-15 12:17 1026前两天 面试的时候面试官突然问我jdk1.5之后的 ...
相关推荐
首先,让我们了解单例模式的几种常见实现方式: 1. 饿汉式(静态常量): 这是最简单的单例实现,它在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private static final ...
本文介绍了一种使用Java单例模式实现简单日志记录器的方法。通过定义静态变量、私有构造函数以及线程安全的实例获取方法,实现了日志记录器的单例模式。此外,还提供了写入日志的方法,便于实际应用中的日志管理。...
在Java中,实现单例模式有多种方法,每种方法都有其特点和适用场景。以下是对这六种常见单例模式实现方式的详细解释: 1. **饿汉式(静态常量)** 这是最简单的单例实现,它在类加载时就创建了实例,线程安全。 `...
Java单例模式是一种设计模式,它允许在程序中创建唯一一个类实例,通常用于管理共享资源,例如数据库连接、线程池或者配置对象等。单例模式的核心在于限制类的构造函数,确保类只能被初始化一次,从而实现全局唯一的...
以下是几种常见的Java单例模式实现方式: 1. **饿汉式(静态常量)**: 这种方式在类加载时即初始化实例,线程安全,但可能导致不必要的内存占用。 ```java public class Singleton1 { private Singleton1() {} ...
在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现方式,它在第一次调用的时候实例化自己。下面是懒汉式单例的四种写法: 1、基本懒汉式...
在多线程环境下,我们需要确保单例实例的创建只发生一次,以上几种方式除了懒汉式(线程不安全)外,都能保证线程安全。对于反序列化测试,由于默认反序列化会生成新实例,需要重写 `readResolve()` 方法来防止这种...
以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private static final Singleton...
下面将详细介绍单例模式的几种常见实现方式。 1. 饿汉式(静态常量) 饿汉式单例在类加载时就完成了初始化,因此线程安全。这种方式简单且效率高,但如果单例对象不被使用,会造成内存浪费。 ```java public class...
在Java中,单例模式的实现通常有几种方法: 1. **饿汉式(静态常量)**:在类加载时就完成初始化,所以类加载比较慢,但获取对象的速度快,且线程安全。 ```java public class Singleton { private static final ...
此外,单例模式还有几种变体,比如静态内部类单例和枚举单例。静态内部类单例利用Java类加载机制保证了线程安全,而枚举单例则是Java中实现单例的最佳方式,因为它天然支持序列化且防止反射攻击。 在代码实现上,...
入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免...
单例模式的实现方式有很多种,下面我们将详细探讨几种常见的单例模式的实现方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了初始化,因此是线程安全的。 ```java public class Singleton { private ...
在Java中,简单工厂模式、工厂方法模式和抽象工厂模式是三种常见的实现方式。简单工厂模式虽然简单易懂,但扩展性较差,因为它将所有产品类型硬编码在工厂类中。工厂方法模式通过定义创建对象的接口,让子类决定实例...
在Java中,实现单例模式主要有两种方式:饿汉模式和懒汉模式。 1. **饿汉模式**: 饿汉模式是在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快,线程安全。在上述代码中,`Singleton`类的实例`...
本篇将深入探讨标题中提及的几种设计模式:Model-View-Controller(MVC)模式、单例模式、代理模式以及工厂模式,尤其是简单工厂模式。 **1. Model-View-Controller (MVC) 模式** MVC模式是一种架构模式,它将应用...
Java单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中非常有用,比如配置类、缓存管理或者数据库连接池等。以下是对Java中实现单例模式的几种...
本文将详细介绍几种常见的单例模式实现方式,并探讨它们在实际开发中的应用和最佳实践。 在实现单例模式时,应注意以下几点: 确保单例类不被继承,可以通过将构造函数设置为私有来实现。 考虑线程安全问题,选择...