提起设计模式,可能你们有些人会感受陌生,有些人会以为常用。其实说到设计模式,不用感到陌生与惧怕,其实咱们天天在不经意间都在或多或少的使用或者接触设计模式。这篇文章就是想带你们了解最基础的设计模式,单例模式!git
单例模式是指,有且只有一个该类的实例化对象,而且实例化过程由这个类本身实现。该类的构造函数是私有化的。github
/**
* 做者:jtl
* 日期:Created in 2019/1/25 15:48
* 描述:饿汉式单例模式
* 优势:1.空间换时间,每次都直接加载,节约了建立实例的时间
* 缺点:1.由于不论是否用到了该类,都会直接建立实例,因此在不使用的状况下,就浪费了空间
*/
public class HungrySingleton {
private static HungrySingleton sSingleton = new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return sSingleton;
}
}
复制代码
/**
* 做者:jtl
* 日期:Created in 2019/1/25 15:45
* 描述:懒汉式单例模式
* 优势:1.时间换空间,在调用的时候才建立实例,节约了空间
* 2.每次getInstance的时候才建立实例,节约了资源
*
* 缺点:1.每次在调用的时候才建立实例,有点浪费时间
* 2.每次调用getInstance都须要线程同步,形成没必要要的开销
*/
public class LazySingleton {
private static LazySingleton sSingleton;
private LazySingleton(){}
public static synchronized LazySingleton getInstance(){
if (sSingleton==null){
sSingleton=new LazySingleton();
}
return sSingleton;
}
}
复制代码
/**
* 做者:jtl
* 日期:Created in 2019/1/25 16:16
* 描述:DCL(Double Check Lock)单例模式
* 优势:1.在懒汉式的基础上进行了判断,只有在第一次建立实例的时候才会,进行线程同步操做。资源利用率高
* 缺点:1.高并发状况下会出现问题
* 2.JDK5以前会出现问题。因为Java编译器容许处理器乱序执行,JDK以前JMM中Cache寄存器到主内存回写顺序的规定,可能1-2-3,也可能1-3-2,因此可能JDK1.5以前出现问题
* (1)给DclSingleton分配内存
* (2)调用DclSingleton()的构造函数,初始化成员字段;
* (3)将mSingleton指向分配的内存空间(此时mSingleton不为null)
* 3.在JDK5以后,Java使用了新的内存模型JSR-133,它加强了volatile的内存语义。使用volatile修饰的对象,不会出现(2)中出现的问题
*/
public class DclSingleton {
private static volatile DclSingleton mSingleton=null;
private DclSingleton(){}
public static DclSingleton getInstance(){
if (mSingleton==null){
synchronized (DclSingleton.class){
if (mSingleton==null){
mSingleton=new DclSingleton();
}
}
}
return mSingleton;
}
}
复制代码
/**
* 做者:jtl
* 日期:Created in 2019/1/25 16:14
* 描述:静态内部类单例模式
* 优势:1.保证了线程安全问题,也能保证单例的惟一性(推荐)
* 缺点:
*/
public class StaticSingleton {
private StaticSingleton(){}
private static StaticSingleton getInstance(){
return StaticSingletonHolder.sSingleton;
}
private static class StaticSingletonHolder{
private static final StaticSingleton sSingleton=new StaticSingleton();
}
}
复制代码
上面例举了几种常见的单例模式,其中本人最为经常使用的是静态内部类单例模式。固然这四种并非全部的单例模式,还有枚举单例模式,以及使用Map容器实现的单例模式。若是是想直接找一个单例模式使用的话,那就直接复制代码就好。若是想知道他们的优缺点的话,就能够看下注释。仍是那句话风里雨里在这里等你,您的一个赞或者收藏就是我写下去的动力,但愿你们共同进步。若有错误请及时提出我也好改正。 另附GitHub源码地址:github.com/13046434521…设计模式