设计模式:单例(懒汉饿汉式,即简单讲解)

单例模式有以下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。


/*
* 设计模式:对问题行之有效的解决方式。其实它是一种思想
* 1、单例设计模式(单个实例)
*     解决的问题:可以保证一个类在内存中的对象唯一性
*     为什么要有单例:可以在多个程序访问对象时,保证他们访问的是同一个对象
*思路 :1、不允许其他程序用new创建该类对象
*         2、在该类中创建一个本类实例
*         3、对外提供一个方法,让其他程序可以获取该对象
*步骤:1、private该类的构造函数(不让用户初始化)
*        2、通过new在本类中创建一个本类的对象
*        3、定义一个共有(public)的方法,将创建的对象返回。
*/


/*饿汉式:不管是啥上来就干,开发时常用*/
class Single//类一加载,对象就已经存在了
{
    static Single s = new Single();//饿汉式的体现,即在创建类时已经有对象

    private Single(){}//构造函数

    public static Single getInstance(String name)
    {

           return s;//小知识点:静态方法访问的元素必须是静态的
    }

}

/*懒汉式:刚开始的时候什么都不做,等啥时候用才啥时候做,面试题常用
* 若被多线程技术访问,有可能导致访问不了对象(以后再补充)
*/
class Single2//只有调用getInstance方法时,才会创建对象
                  //也称为延迟加载形式
{
     private static Single2 s = null;

     private Single2(){}

     public static Single2 getInstance()
     {
         if(s==null)
              s = new Single2();//若空则创建,不空则不创建。
         return s;
     }
}

class Test
{
    private int num;
/*构造函数私有化*/
    private Test(){}
/*在类中创建一个本类类型的对象*/
    private static Test t = new Test();
/*对调用者返回唯一的对象。此时t代表已创建对象的地址。
* 不管函数调用多少次这里返回的都是同一个地址
*/
    public static Test getInstance()
    {
        return t;
    }

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


public class SingleDemo {


     public static void main(String[] args) {
         Single s1 = Single.getInstance("");
         Single s2 = Single.getInstance("");

         System.out.println(s1==s2);//true。两者是相等的,说明s1、s2指向同一片空间



         // Test t1 = new Test();因为getInstance函数是静态的,可以直接用类名.函数名的形式调用。
         // Test t2 = new Test();

         /*如果使用new关键字,则代表在堆中创建了一片空间,但是因为成员是静态的,被保存在静态区内,所以堆中开辟出的空间等于垃圾。*/
         Test t1 = Test.getInstance();
         Test t2 = Test.getInstance();
         /*在这里,t1、t2得到的值是同一个*/
         t1.setNum(10);
         t2.setNum(20);

        /*先给num赋值10,再赋值20.因为两者指向同一片空间,所以第一次赋值的10已经被第二次赋值的20覆盖掉了*/
         System.out.println(t1.getNum());//20
         System.out.println(t2.getNum());//20

    }

}

原文地址:https://www.cnblogs.com/sjbas/p/5354591.html