java单例模式 实例_Java单例模式的例子

本文详细介绍了Java中的单例模式,包括懒汉式、饿汉式和登记式单例的实现。懒汉式单例在多线程环境下需要同步,但能延迟加载;饿汉式单例在类加载时即创建实例,线程安全但不支持延迟加载;登记式单例结合两者,允许子类实例化,但可能存在实例化浪费的问题。
摘要由CSDN通过智能技术生成

http://blog.sina.com.cn/s/blog_7e9b4ad701015iqf.html

单例模式是一种常见的设计模式

单例模式分三种

懒汉式单例、

饿汉式单例、

登记式单例。

单例模式有一下特点:

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

懒汉式单例:

需要加锁才能实现多线程同步,但是效率会降低。优点是延时加载。

public class LazySingleton {

//私有静态变量,加载时不初始化

private

static LazySingleton lazySingleton = null;

//私有的构造方法,避免外部创建实例

private

LazySingleton(){

}

synchronized

public static LazySingleton getInstance(){

if(lazySingleton == null){

lazySingleton = new

LazySingleton();

}

return

lazySingleton;

}

}

饿汉式单例:

因为加载类的时候就创建实例,所以线程安全(多个ClassLoader存在时例外)。

缺点是不能延时加载

public class EagerSingleton {

//私有静态唯一的变量,在类加载好了,就创建了实例

private static final EagerSingleton eagerSingleton = new

EagerSingleton();

//私有的构造方法,避免外界创建实例

private EagerSingleton(){

}

public

static EagerSingleton getInstance(){

return eagerSingleton;

}

}

登记式单例:

登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。

只是它的子类实例化的方式只能是懒汉式的, 这是无法改变的。

登记式单例类的一个缺点:(1)由于子类必须允许父类以构造子调用产生实例,因此,

它的构造方法必须是公开的这样一来,就等于允许了以这样方式产生实例

而不在父类的登 记中。(2)由于父类的实例必须存在才可能有子类的实例,

这在有些情况下是一个浪费。这是登记式单例类的另一个缺点。

import java.util.*;

public class RegSingleton {

//登记薄,用来存放所有的实例

private

static Map regSingletonMap = new HashMap();

//在类加载的时候添加一个实例到登记薄

static{

RegSingleton regSingleton = new

RegSingleton();

regSingletonMap.put(regSingleton.getClass().getName(),regSingleton);

}

//保护的默认构造子

protected

RegSingleton(){

}

public

static RegSingleton getInstance(String name){

if(name == null){

name = "RegSingleton";

}

if(regSingletonMap.get(name)

== null){

try{

regSingletonMap.put(name,

(RegSingleton)Class.forName(name).newInstance());

}catch(Exception e){

e.printStackTrace();

}

}

return

regSingletonMap.get(name);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值