单例设计模式
概念
设计模式:软件前辈们在做项目的过程中,对于某类问题,发明了一些最为有效的解决方式。
Java语言中,总共有23种设计模式
从今天开始:会陆陆续续介绍:单例,工厂,模板,策略等待
单例设计模式:设计一个类,要保证该类有且只能创建一个对象的代码书写方式经验的总结
单例模式的作用和意义:能避免重复创建;应用于避免存在多个实例引起程序逻辑错误的场合;较节约内存,因为它限制了实例的个数,有利于java垃圾回收
两种模式
饿汉式:
- 准备一个私有的静态属性,属性类型即为本类类型(且要进行实例化)
- 准备一个私有的无参数的构造函数
- 对外暴露一个获取本类实例的静态方法
需求:
使用单例设计模式,设计一个美国总统类。
/**
* 美国总统单例类
*/
public class AmericaPresident {
//饿汉式:
//1.准备一个私有的静态属性,属性类型即为本类类型(且要进行实例化)
private static AmericaPresident instance = new AmericaPresident();
//2.准备一个私有的无参数的构造函数
private AmericaPresident(){//一定要是私有的,否则,在该类外部,可以构建任意多个对象
super();
}
//3.对外暴露一个获取本类实例的静态方法
public static AmericaPresident getInstance(){//必须将该类升级为静态方法,保证可以绕过实例,通过类名直接调用该方法
return instance;
}
}
/**
* 单例测试类
*/
public class TestPresident {
public static void main(String[] args) {
//需求:
//构建多个实例,比对各个实例的地址,看是否指向堆中的同一个对象
//AmericaPresident aoBaMa = new AmericaPresident();
//这里会提示报错,因为我们在单例类中设置了私有的构造方法,所以不能直接构建,那么要我想构建要怎么构建呢?
AmericaPresident aoBaMa = AmericaPresident.getInstance();
AmericaPresident aoBaMa2 = AmericaPresident.getInstance();
System.out.println("是同一个实例否?"+(aoBaMa == aoBaMa2));
System.out.println("是同一个实例否?"+(aoBaMa.equals(aoBaMa2)));
}
}
懒汉式
- 准备一个私有的静态属性,属性类型即为本类类型
- 准备一个私有的无参数的构造函数
- 对外暴露一个获取本类实例的静态方法
- 先判断属性是否为null,若为null,那么就new;否则直接返回即可
需求:
使用单例设计模式,设计一个Emporor(皇帝类)。
/**
* 皇帝单例类
*/
public class Emporor {
// 懒汉式:
// 1.准备一个私有的静态属性,属性类型即为本类类型
private static Emporor emporor;
// 2.准备一个私有的无参数的构造函数
private Emporor(){
super();
}
// 3.对外暴露一个获取本类实例的静态方法
// 先判断属性是否为null,若为null,那么就new;否则直接返回即可
public static Emporor getInstance(){
if (emporor == null){
emporor = new Emporor();
}
return emporor;
}
}
/**
* 皇帝类测试类
*/
public class TestEmporor {
public static void main(String[] args) {
Emporor emporor1 = Emporor.getInstance();
Emporor emporor2 = Emporor.getInstance();
System.out.println("是否是同一个皇帝呢?"+(emporor1==emporor2));
//如果两个引用类型通过==来比较,
// 比较的是两个实例在堆内存中的首地址值是否相同
}
}