单例模式也是一种比较常见的设计模式,它到底能带给我们什么好处呢?其实无非是三个方面的作用:
1、控制资源的使用,通过线程同步来控制资源的并发访问;
2、控制实例产生的数量,达到节约资源的目的。
3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
懒汉式:
package cn.Instance.impl;
public class Instance_1 {
//在内存中缓存一个实例空间
private
static Instance_1 instance_1 =null;
//收回外部类实例的权限
private
Instance_1(){
}
public
static Instance_1 getInstance_1(){
//对于线程不安全的代码进行同步
synchronized(Instance_1.class){
//判断是否存在类实例如果不存在就实例化一个
if
(instance_1==null) {
instance_1=new Instance_1();
}
}
//如果存在就返回已存在的
return
instance_1 ;
}
}
饿汉式:
package cn.Instance.impl;
public class Instance_2 {
//在类加载的时候就实例化一个类实例
private
Instance_2 instance_2=new Instance_2();
//收回外部对于该类的实例化权限
private
Instance_2(){
}
//定义返回实例的方法
public
Instance_2 getInstance_2(){
return
instance_2;
}
}
登记式——控制实例的数量:
package cn.Instance.impl;
import java.util.HashMap;
import java.util.Map;
public class Instance_3 {
private
static Map map=new HashMap();
//定义当前实例个数
private
static int NUM=1;
//定义最大实例个数
private
static int COUNT=3;
public
static Instance_3 getInstance_3() {
Instance_3
instance_3=(Instance_3) map.get(NUM);
//判断是否存在实例
if
(instance_3==null) {
instance_3=new Instance_3();
map.put(NUM,
instance_3);
}
NUM++;
//判断是否超过限定的实例个数
if
(NUM>COUNT) {
NUM=1;
}
return
instance_3 ;
}
}