解决一个类在内存中只有一个对象,想要保证对象的唯一,为了避免不一致状态
单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
实现步骤:
1、将构造函数私有化
2、在类中创建一个私有的本类对象
3、提供一个用类名调用的公有方法获取该对象。
饿汉式:不管用不用,先实例化唯一的对象,消耗内存。
//饿汉式 在类初始化时,已经自行实例化
//1、将构造函数私有化。因为实例化会调用这个构造函数来进行初始化。
private LunGe(){
}
//2、在类中创建一个私有的本类对象,创建这个类要保证能够被共享,能够被其他类使用
private static LunGe s = new LunGe();
//3、提供一个用类名调用的公有方法获取该对象。
public static LunGe getLunGe(){
//保险,防止空指针报错
if(s == null){
s = new LunGe();
}
return s;
}
懒汉式:用的时候再实例化唯一的对象,不用的使用节约内存(懒加载)
//懒汉式 在第一次调用的时候实例化自己
//1、将构造函数私有化。因为实例化会调用这个构造函数来进行初始化。
private LunGe(){
}
//2、在类中创建一个私有的本类对象,创建这个类要保证能够被共享,能够被其他类使用
private static LunGe s = null;
//3、提供一个用类名调用的公有方法获取该对象。
public static LunGe getLunGe(){
//保险,防止空指针报错
if(s == null){
s = new LunGe();
}
return s;
}
调用LunGe类中的getLunGe()。
public class SingletonMode {
public static void main(String[] args) {
LunGe l1 = LunGe.getLunGe();
LunGe l2 = LunGe.getLunGe();
l1.setName("伦哥一号");
l2.setName("帅气的伦哥");
System.out.println(l1);
System.out.println(l2);
System.out.println(l1 == l2);
System.out.println(l1.getName()); //帅气的伦哥
}
}
参考:
JAVA设计模式之单例模式