单例设计模式的原则:保证内存中只有一个对象的存在
单例设计模式的步骤
声明一个类,类中有一个静态属性与类名相同
把空参构造方法声明为私有的
在类中提供一个公共的访问方法来返回该对象的实例
单例设计模式的三种实现方式
饿汉式:在构造类时 就将对象new出来 :private static SingletonDemo1 instance = new SingletonDemo1(); class SingletonDemo1{
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1() {
}
public static SingletonDemo1 getInstance() {
return instance;
}
} public class Singleton {
public static void main(String[] args) {
SingletonDemo1 s1 = SingletonDemo1.getInstance();
System.out.println(s1);
System.out.println(SingletonDemo1.getInstance());
System.out.println(SingletonDemo1.getInstance());
//输出:
//SingletonDemo1@7852e922
//SingletonDemo1@7852e922
//SingletonDemo1@7852e922
}
}
代码分析:因为SingletonDemo1的构造方法为private因此不能创建新的对象,而SingletonDemo1的对象通过类中的instance创建了出来,且是static类型,因此初始化时就会加载到内存中,每次调用getInstance方法就会返回该instance所以每次调用该方法都是返回此instance。
懒汉式 class SingletonDemo2{
private static SingletonDemo2 instance;
private SingletonDemo2() {
}
public static SingletonDemo2 getInstance() {
if(instance == null) {
instance = new SingletonDemo2();
}
return instance;
}
} public class Singleton {
public static void main(String[] args) {
SingletonDemo2 s2 = SingletonDemo2.getInstance();
System.out.println(s2);
System.out.println(SingletonDemo2.getInstance());
System.out.println(SingletonDemo2.getInstance());
/*输出
SingletonDemo2@4e25154f
SingletonDemo2@4e25154f
SingletonDemo2@4e25154f
*/
}
}
代码分析:与饿汉式相类似,但是将getInstance()方法定义为static,同时将instance也定义为static,加载类时会将该方法直接加载到内存然后如果instance为null就创建一个SingletonDemo2对象,不为null就直接返回该对象。保证了内存中只有一个对象。
简易式 class SingletonDemo3{
public static final SingletonDemo3 instance = new SingletonDemo3();
private SingletonDemo3() {
}
} public class Singleton {
public static void main(String[] args) {
SingletonDemo3 s3 = SingletonDemo3.instance;
System.out.println(s3);
System.out.println(SingletonDemo3.instance);
System.out.println(SingletonDemo3.instance);
/*输出
SingletonDemo3@70dea4e
SingletonDemo3@70dea4e
SingletonDemo3@70dea4e
*/
}
}
代码分析:与饿汉式类似,不定义getInstance()方法 而是将instance设置为public直接调用,但是这种方法有缺陷,可能会造成instance的修改,不安全。
饿汉式与懒汉式的区别
饿汉式:空间换时间
懒汉式:时间换空间
在多线程访问时,饿汉式不会创建多个对象,懒汉式会创建多个对象
如果考虑线程安全问题 使用饿汉式,不考虑线程安全问题的话可以使用懒汉式