单例模式

单例模式


目录
1 单例模式 1
1.1 单例模式的要点 1
1.2 单例模式的使用场景 1
1.3 单例模式的实现 1
1.3.1 饿汉式单例 1
1.3.2 懒汉式单列 2
1.3.3 单列模式的优缺点 2
1.3.4 登记式单列 2
1.4 单例模式应用---属性管理器 3
1.5 多例模式 3



1 单例模式
1.1 单例模式的要点
(1) 单例类只能有一个实例。
(2) 单例类必须自己创建自己的唯一的实例。
(3) 单例类必须给其他对象提供这一实例。

1.2 单例模式的使用场景
单例模式使用的必要条件就是一类只能有一个实例的场景,如系统的资源管理,回收站,打印机,数据库连接等。

1.3 单例模式的实现

1.3.1 饿汉式单例
public class SingletonEage {

/**
* static变量在类装载的时候就会进行初始化,且只初始化一次,整个类共享这个变量实例。
* final变量一旦初始化后就不能被改变。
* instance来存储单例实例。
*/
private static final SingletonEage instance = new SingletonEage();

/**
* 私有的构造方法,使得外部类不能创建该类的实例,可以在内部控制创建实例的数目
*/
private SingletonEage(){}

/**
* 提供外部类获取实例的方法,构造方法私有化,外部类不能构造该类的实例。
* static方法,可以通过类调用该方法返回该类的实例。
*/
public static SingletonEage getInstance(){
return instance;
}
}


1.3.2 懒汉式单列
public class SingletonLaze {

/**
* private变量,定义一个私有变量来存储创建的实例
* static变量在类装载的时候就会进行初始化,整个类共享这个变量实例。
*/
private static SingletonLaze instance = null;

/**
* 私有的构造方法,使得外部类不能创建该类的实例,可以在内部控制创建实例的数目
*/
private SingletonLaze(){}

/**
* synchronized 锁定该类的同步锁,实现线程安全
* static方法,可以通过类调用该方法返回该类的实例。
*/
synchronized public static SingletonLaze getInstance(){
//判断实例是否为null,为null则创建该类的实例。
if(instance == null){
instance = new SingletonLaze();
}
return instance;
}

}


1.3.3 单列模式的优缺点
饿汉式实现单例是以空间换时间,当饿汉式单例类在类装载的时候就会被创建类实例,不管你用不用先创建出来,然后每次要使用实例的时候在获取实例,不用像赖汉式那样使用的时候去判断实例是否存在,从而节约了时间。
懒汉式实现单例是以时间换空间,懒汉式不想饿汉式那样在类加载的时候创建类实例,而是等待要使用实例的时候在去判断实例是否存在,如果不存在则创建类实例,特别是使用同步锁方法,这样会降低方法的访问速度,使得每次使用实例都需要同步去判断类实例是否存在,这样,会花费很多时间。
双重检查加锁:可以使用双重检查加锁来提高懒汉式的性能。并不是每次调用获取类实例方法都需要同步,可以先不同步方法,进入方法后,先检查类实例是否存在,如果不存在才进入同步块,创建类实例,第一次检查的时候需要进入同步块,当再次进入获取类实例方法后,再次检查类实例是否存在,此时类实例已经存在则不需要在进入同步块。这样一来只需要同步一次,从而减少了多次同步浪费的时间。
/**
* static方法,可以通过类调用该方法返回该类的实例。
*/
public static SingletonLaze getInstance(){
//判断实例是否为null,为null则创建该类的实例。
if(instance == null){
//同步块,保证线程安全
synchronized (this) {
if(null == instance)
instance = new SingletonLaze();
}
return instance;
}
}


1.3.4 登记式单列
登记式单列利用Map缓存的思想来实现单列,在类加载的时候创建好一个类实例缓存到map中,同过该map可以获取该类实例。

package com.singleton;

import java.util.HashMap;

/**
* @author xmong
*
*/
public class SingletonReg {


private static HashMap instanceMap = new HashMap();

static{
SingletonReg instance = new SingletonReg();
instanceMap.put(instance.getClass().getName(), instance);
}

protected SingletonReg(){}


public static SingletonReg getInstance(String name){
if(name==null){
name="com.singleton.SingletonReg";
}
if(instanceMap.get(name)==null){
try {
instanceMap.put(name, Class.forName(name).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
return (SingletonReg)instanceMap.get(name);
}

}


1.4 单例模式应用---属性管理器

1.5 多例模式


---------------------------------------------------

参考:
《java与模式》
《研磨设计》

未完待续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值