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


    单例模式有以下特点:
      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

        }

    }

  • 相关阅读:
    ASP.NET MVC5(二):控制器、视图与模型
    LINUX重启MYSQL的命令
    mysql unrecognized service问题解决
    UML类图几种关系的总结
    java用org.apache.poi包操作excel
    struts2.xml 中result type属性说明
    MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法
    报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost
    linux下使用yum安装mysql
    关于LINUX权限-bash: ./startup.sh: Permission denied
  • 原文地址:https://www.cnblogs.com/sjbas/p/5354591.html
Copyright © 2020-2023  润新知