黑马程序员——java基础—单例设计模式

来源:互联网 发布:2015年出境游数据 编辑:程序博客网 时间:2024/06/11 00:46

------- android培训、java培训、期待与您交流! ----------

单例设计模式

什么叫设计模式

设计模式指的是解决某一类问题行之有效的解决办法。

单例设计模式是用来解决什么问题的

单例模式可以保证一个类的对象唯一性。

比如多个程序都要使用同一个配置文件中的数据,且要实现数据共享和交换。必须要将数据封装到一个对象中,让不同的程序操作的是同一个对象。也就是说必须保证这个配置文件的对象唯一性。这个时候就是用单例。

单例设计模式的两种代码体现

饿汉式与懒汉式

1.饿汉式单例设计模式:这是先初始化对象,称为:饿汉式。 SingleDemo类一进内存,就已经创建好了对象。

<pre name="code" class="java">    //饿汉式单例设计模式        class SingleDemo {                       //初始化一个静态本类对象,对,是本类对象。且本类对象在类初始化的时候就被创建。            //可以理解成,饿汉很饿,要迫不及待的将本类对象吃到肚子里。           private static SingleDemo s = new SingleDemo();                      //单例设计模式首先要有自己的私有,对,私有构造函数            private SingleDemo(){}                   public SingleDemo getString(){                            return s;                      }            }            


    

2.懒汉式单例设计模式:该单例模式在被调用方法时,才初始化对象,也叫对象的延时加载。称为:懒汉式。

注意:缺点:如果当线程刚执行完If(s==null)语句,该线程失去执行权,而另一个线程也运行该代码,判断s时也为空,创建了一个对象,第一个线程在运行时就又创建一个对象,不能保证单例了。

这时我们想到了锁。

总结:即便懒汉式能确保只创建一个对象,但是耗时太多,不如饿汉式方便。

面试点:  ifs==null

         {

                Synchronized(SingleDemo2.class)

             {

                      if(s==null)

                         s= new SingleDemo2()

}         

}

<pre name="code" class="java">  //懒汉式单例设计模式      class SingleDemo2 {                    //初始化一个静态本类对象,对,是本类对象          private static SingleDemo2 s = null;                   //单例设计模式首先要有自己的私有,对,私有构造函数         private SingleDemo2(){}                    //懒汉式单例设计模式在被调用方法的时候才初始化对象,对,懒汉很懒,被调用的时候才初始化         public SingleDemo2 getString(){                            if(s==null)                 s = new SingleDemo2();             return s;                       }            }    


单例设计模式的小测试:

    //描述超人。        class SuperMan       {            private String name;//私有属性                        private static SuperMan man = new SuperMan("克拉克");//初始化一个本类对象                        private SuperMan(String name)            {              this.name = name;             }                    public static SuperMan getInstance()//获取本类对象的方法          {              return man;          }                    public void setName(String name)          {             this.name = name;          }                   public String getName()          {              return this.name;          }                    public void fly()          {              System.out.println(this.name +"..fly");          }      }            class SingleTest       {          public static void main(String[] args)           {              //超人对象应该是唯一的。保证superMan的唯一性。可使用单例模式解决。      //      SuperMan man = new SuperMan("克拉克");//单例不能new对象,它的构造函数是私有的              //man1、man2分别获取SuperMan的对象,因为SuperMan使用的是单例设计模式,所以他们获得的对象是同一个              SuperMan man1 = SuperMan.getInstance();              SuperMan man2 = SuperMan.getInstance();              man1.setName("英雄");//单例设计模式可以实现数据的共享和交换              man2.fly();//输出:英雄...fly          }      }    

 


0 0
原创粉丝点击