单例模式是最简单的设计模式 , 甚至在学校中就可以学到 , 也是很多初级程序员(比如我)会的唯一的设计模式.那么这种设计模式有什么用呢 , 具体怎么实现?
基础概念
- 因为内存原因 , 希望整个系统只有一个全局对象, 有利于对整个系统的协调管理 , 比如SharedPreference , 构造多个实例过于浪费
- 定义:一个类只有一个实例 , 并向整个系统提供
关键点
- 构造函数不开放
- 通过静态方法来返回对象
- 单例类有且只有一个
单例模式的几种实现
1. 饿汉式
public class TestTwo {
// 在初始化静态变量时就创建对象 , 会在初始化时候稍慢一些
private static TestTwo instance=new TestTwo();
private TestTwo(){
}
public static TestTwo getInstanceHunger(){
return instance;
}
}
2. 饱汉式
public class TextOne {
private static TextOne instance;
private TextOne(){
}
// 在使用该方法时才开始创建对象
public static synchronized TextOne getInstanceFull(){
if (instance==null){
instance=new TextOne();
}
return instance;
}
}
使用TestOne.getInstance()方法是才会开始创建对象 , 对于并发不是很高的类 , 这种方法完全没有问题 .但是在高并发下会创建多个实例 , 失去单例的意义
3. DLC模式
public class TestThree {
private volatile static TestThree instance=null;
private TestThree(){
}
public static TestThree getInstance(){
if (instance==null){ //避免不必要的同步
synchronized (TestThree.class){
if (instance==null){ // 验证赋值
instance=new TestThree();
}
}
}
return instance;
}
}
首先在这里加入了两个判断 , 第一层是为了避免不必要的同步, 第二层是为了在null的情况下获取实例.
然后要注意volatile关键字, 在读取volatile类型的变量时总会返回最新写入的值, 所以即使发生了指令乱序 , 也不会干扰到instance的赋值 .
4. 静态内部类
public class TestFour {
private TestFour(){}
public static TestFour getInstance(){
return SingletonHolder.instance;
}
// 内部类
private static class SingletonHolder{
private static final TestFour instance=new TestFour();
}
}