什么是设计模式?一个问题有n种解法,其中肯定有一种是最优的,这个最优的解法被人总结出来了,称之为设计模式。
设计模式要明白特点是什么?解决什么问题?怎么写?
饿汉式单例类
单例设计模式确保一个类只能创建一个对象。如何确保只能创建一个对象呢?如果在单例类的类外直接创建对象,可以创建无数个对象。
//1、如何确保只能创建一个对象
//A a1 = new A();
//A a2 = new A();
//A a3 = new A();
所以不能在类外创建对象,要使得类外不能创建对象,我们要把单例类的构造器私有。私有构造器后类外不能创建对象,我们要在单例类内部创建对象,且有且只能创建1个对象,结合静态变量只有1份的特点,我们要用到static修饰。
public static A a = new A();
因为a是公开的,类外可以用A.a调用,也可以给它赋值,也就是说会将对象的值破坏。
A.a = null;
System.out.println(A.a);
所以,我们最好要对变量私有化,并提供对外的静态接口方法。
//3、提供对我的接口方法
public static A getInstance(){
return a;
}
为了在单例类的内部不修改(破坏)对象,我们用final修饰。
private static final A a = new A();//a在本类中只有1份
在外部不能直接调用a,而是调用A.getInstance。
A a1 = A.getInstance();
System.out.println(A.getInstance());
刚刚的单例类属于++饿汉式单例++,拿对象时,对象已经创建好了。
懒汉式单例类
特点:用对象时才开始创建对象。
1、构造器私有
2、定义静态变量用于存储对象,但是不能在此处创建对象。
3、提供一个静态方法,保证返回的是同一个对象。(需要对象才开始创建对象)
package com.ljh.singleinstance2;
public class A {
//1、私有化构造器
private A(){
}
//2、私有化静态变量
private static A a;
//3、提供静态方法返回对象
public static A getInstance(){
if(a==null){//保证只能创建1个对象
a = new A();//当第二次拿对象时,a != null,不会创建对象
}
return a;
}
}
package com.ljh.singleinstance2;
public class Test {
public static void main(String[] args) {
//目标:认识懒汉式单例类
A a = A.getInstance();//第一次拿对象
A a2 = A.getInstance();//第二次拿对象
System.out.println(a);
System.out.println(a2);
}
}
刚刚的单例类属于懒++汉式单例++,需要对象时,才开始创建对象。