Java的单例模式
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
java的单例模式有两种实现方式:饿汉式、懒汉式。
一、饿汉式:
实现步骤:
1. 构造器私有化 => 防止直接 new;
2. 类的内部创建对象(该对象时static);
3.向外暴露一个静态的公共方法;
缺点:可能会造成创建了对象,但是没有使用,造成了资源的浪费
代码实现:
public class SingleTon01 {
public static void main(String[] args) {
// Girlfriend jerry = new Girlfriend("jerry");
Girlfriend instance1 = Girlfriend.getInstance();
instance1.getName();
Girlfriend instance2 = Girlfriend.getInstance();
instance2.getName();
System.out.println(instance1 == instance2); // 由此可知,instance1 和 instance2 是一个对象
}
}
class Girlfriend{
private String name;
// 2.类的内部创建对象;
private static Girlfriend gf = new Girlfriend("mary");
// 1.将构造器私有化
private Girlfriend(String name) {
this.name = name;
}
// 3. 提供一个公共的static方法,返回 gf 对象
public static Girlfriend getInstance() {
return gf;
}
public void getName() {
System.out.println("姓名:" + name);
}
}
二、懒汉式:
只有当用户使用getInstance时,才会创建对象。如果再次调用getInstance,他不会在创建对象,会将之前创建的对象返回;
实现步骤:
1. 构造器私有化 => 防止直接 new;
2. 定义一个静态属性,但是不new;
3.提供一个public的static方法,可以返回一个Cat对象;
缺点:懒汉式存在线程安全问题;
代码实现:
public class SingleTen02 {
public static void main(String[] args) {
Cat cat1 = Cat.getInstance();
System.out.println(cat1.getName());
Cat cat2 = Cat.getInstance();
System.out.println(cat2.getName());
System.out.println(cat1 == cat2);
}
}
// 希望在程序运行过程中,只能创建一个Cat对象
class Cat {
private String name;
// 2. 定义一个静态属性,但是不new
private static Cat cat;
// 1. 构造器私有化
private Cat(String name) {
this.name = name;
}
// 3. 提供一个public的static方法,可以返回一个Cat对象
public static Cat getInstance() {
if(cat == null){
cat = new Cat("小灰灰");
}
return cat;
}
public String getName() {
return name;
}
}