什么是单例模式
- 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,而且该类是提供一个取得其对象实例的方法
- 单例模式有两种方式:
- 饿汉式
- 懒汉式
示例代码
饿汉式示例代码
class GirlFriend {
private String name;
private static GirlFriend gf = new GirlFriend("小红红");
private GirlFriend(String name) {
System.out.println("構造器被調用.");
this.name = name;
}
public static GirlFriend getInstance() {
return gf;
}
@Override
public String toString() {
return "GirlFriend{" + "name='" + name + ''' + '}';
}
}
懒汉式示例代码
class Cat {
private String name;
public static int n1 = 999;
private static Cat cat;
private Cat(String name) {
System.out.println("构造器调用...");
this.name = name;
}
public static Cat getInstance() {
if (cat == null) {
cat = new Cat("小可爱");
}
return cat;
}
@Override
public String toString() {
return "GirlFriend{name='" + name + "'}";
}
}
双重检测机制
public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
synchronized (SingletonDemo.class){
if(instance==null){
instance=new SingletonDemo();
}
}
}
return instance;
}
}
懒汉式和饿汉式的区别
- 创建对象时机不同
- 饿汉式:在类加载时就创建了对象实例
- 懒汉式:使用时才创建
- 线程安全
- 资源浪费
- 饿汉式:由于类加载时就进行了创建,可能存在实例化后没有使用的情况,造成资源浪费
- 懒汉式:使用时创建,不存在资源浪费
- 在JavaSE标准类中,java.lang.Runtime就是经典的单例模式
参考
【零基础 快速学Java】韩顺平 零基础30天学会Java