单例设计模式

必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。


1.如何保证对象的唯一性

  • 不允许该类创建一个本类实例
  • 对该类创建一个本类实例
  • 对外提供一个方法让其他程序可以获取该对象 2.步骤:
  • 私有化该类构造函数
  • 通过new在本类中创建一个本类对象
  • 定义一个公有的方法,将创建的对象返回

3.例如:新建一个测试类

class Test{
    private int num;

    private static Test t = new Test();   //通过new在本类中创建一个本类对象
    private Test(){}                                 //私有化构造函数
    public static Test getInstance(){     //定义一个公有的方法,将创建的对象返回
        return t;
    }

    public void setNum(int num){
        this.num = num;
    }
    public int getNum(){
        return num;
    }

}

如果在main中直接new两个对象

  • 方式1
class Demo{
    public static void main(String[] args){
        Test t1 = new Test();
        Test t2 = new Test();
        t1.setNum(10);
        t2.setNum(20);
        System.out.println(t1.getNum());
        System.out.println(t2.getNum());
    }
}

输出结果为

  10
  20

未达到内存中只有一个对象的要求

  • 方式2
class Demo{
    public static void main(String[] args){
        Test t1 = Test.getInstance();
        Test t2 = Test.getInstance();
        t1.setNum(10);
        t2.setNum(20);
        System.out.println(t1.getNum());
        System.out.println(t2.getNum());
    }
}

输出结果为

  20
  20

利用此方法t1 t2操作的时同一个对象吗,所以满足内存了中只有一个对象的要求


4.饿汉式 (开发时常用)

 class Single { // 类一加载,对象就已经存在了

    private Static Single s = new Single();

    private Single(){}

    public static Single getInstance(){
        return s;
    }
}

5.懒汉式 (面试时较前者更常问)

 class Single2 { // 类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象
 //延迟加载形式

    private Static Single2 s = null;

    private Single2(){}

    public static Single2 getInstance(){
        if(s==null)
            s = new Single2();
        return s;
    }
}

遥望漉雪千山都过尽,隔海隔山你的背影。