版权声明:本文为博主原创文章,可以随意自由转载传播,但请注明出处. https://blog.csdn.net/aikongmeng/article/details/88542971
单例模式的概念:
确保一个类只有一个实例,且自动实例化向外提供这个实例。
使用场景:
1.要求生唯一对象的场景
2.需求提供一个共享访问或者共享数据
3.创建一个对象需要消耗过多资源,如要访问IO 或数据库资源
4.需要定义大量的静态变量和静态方法的场景 ,如工具类
常见写法:
传说中的饿汉:
/**
* 饿汉,
* 线程安全,
*/
public class ESingleton {
//初始化时生成实例
private static ESingleton singleton = new ESingleton();
//必须是私有
private ESingleton(){
}
//对外提供实例的访问
public static ESingleton getInstance(){
return singleton;
}
}
传说中的懒汉:
/**
* 懒汉,
* 线程不安全,不适用高并发场景,
*/
public class LSingleton {
private static LSingleton singleton = null;
private LSingleton(){
}
//使用实例时没有实例化过再初始化
public static LSingleton getInstance(){
if (singleton ==null){
singleton = new LSingleton();
}
return singleton;
}
}
解决 线程不安全问题,可以给 getInstance 方法加上 synchronized 关键字。
变种写法:
public class Dog {
private Dog() {
}
private static class DogHolder {
private static final Dog dog = new Dog();
}
public static Dog getInstance() {
return DogHolder.dog;
}
public static void bark() {
System.out.println("汪汪汪 ");
}
public void eat() {
System.out.println("就是吃");
}
}
定义参考:《设计模式之禅