引言
人总会有独自走一段孤独的旅程,这段旅程是孤独的,这段旅程是痛苦的,这段旅程是很困难的,只要在最困难的时候仍然不放弃努力,那么这一切都会过去,你总有一天会拨开云雾见天日,守得云开见月明。
单例模式定义
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
大家都知道“一夫一妻制”,在中国,一个男人,有且只能有一个媳妇,如果你非要找个小三,势必会增加开销,占用更多资源。所以没资本的屌丝们,劝你们,媳妇这个对象有且只能创建一个,如果你不自量力,非要整个小三出来,像某某官员,一般不会出问题,但当小三和你媳妇争夺资源的时,势必会出现致命性的bug,信不信由你?
单例模式类图
实现单例模式条件
通过观察上面类图可知:
1.静态的私有化字段;
private static Singleton uniqueInstance;
2.私有构造器
private Singleton(){
}
3.提供公共的访问该类实例的方法.
public static Singleton getInstance(){
return uniqueInstance;
}
常见的单例模式
一、饿汉式
/**
* 饿汉式
* @author Knight
*
*/
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return uniqueInstance;
}
}
优点:
1.线程安全
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。
3.通过sealed修饰类,阻止派生类的出现,因为派生可能会增加实例。
缺点:
资源效率不高,可能GetInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化。
二,懒汉式
/**
* 单例模式 确保一个类只有一个实例,并提供该实例的全局访问点。 懒汉式-线程不安全
*
* @author Knight
*
*/
public class Singletion {
private static Singletion uniqueInstance;
// 私有构造函数
private Singletion() {
}
public static Singletion getUniqueInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singletion();
}
return uniqueInstance;
}
}
懒汉双重校验-线程安全的
/**
* 懒汉式
* @author Knight
*
*/
public class MeSingleton {
private static MeSingleton uniqueInstance;
private MeSingleton(){
}
/**
* 双重校验锁-线程安全的
* @return
*/
public static MeSingleton getInstance(){
if(uniqueInstance == null){
synchronized (MeSingleton.class) {
if(uniqueInstance == null){
uniqueInstance = new MeSingleton();
}
}
}
return uniqueInstance;
}
}
懒汉式面临线程安全的问题,通过双重锁定这样的处理才可以保证安全。
测试
public class SingletonTest {
public static void main(String[] args) {
MeSingleton singleton1 = MeSingleton.getInstance();
MeSingleton singleton2 = MeSingleton.getInstance();
if(singleton1 == singleton2){
System.out.println("两个对象相同");
}else{
System.out.println("两个对象不一样");
}
}
}
结果
本打算创建个对象,给我买个苹果的,看来两个对象一样,也只能自己给自己买了。
总结
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。
参考博客:https://www.cnblogs.com/wolf-sun/p/3489549.html
博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。