23种设计模式之单例模式

来源:互联网 发布:halcon二维码识别优化 编辑:程序博客网 时间:2024/06/03 17:57

单例模式可以说是我最早接触的一种设计模式(当时还不知道设计模式的时候),等到后来说单例,才知道是一种设计模式,下面谈谈对单例的理解

概念:

确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例


注释:1.私有构造方法

     2.指向自己实例的私有静态引用

             3.以自己实例为返回指的静态的公有方法


适用性:

1.每次从getInstance()都能返回一个且唯一一个对象

2.资源共享的情况下,getInstance()必须适用多线程并发访问

3.提高访问性能


分类:

饿汉式和懒汉式

具体应用

饿汉式

<span style="font-size:18px;">public class Singleton {      private static Singleton singleton = new Singleton();      private Singleton(){}      public static Singleton getInstance(){          return singleton;      }  }  </span>


遇到的问题:假设这样的场景:两个线程并发调用Singleton.getInstance(),假设线程一先判断完instance是否为null,既到if这里。刚刚判断完毕后,JVM将CPU资源切换给线程二,由于线程一还没执行(instance = new SingletonA();),所以instance仍然是空的,因此线程二执行了new Signleton()操作。片刻之后,线程一被重新唤醒,它执行的仍然是new Signleton()操作。所以这种设计的单例模式不能满足第2点需求。


懒汉式

<span style="font-size:18px;">public class Singleton {      private static Singleton singleton;      private Singleton(){}            public static synchronized Singleton getInstance(){          if(singleton==null){              singleton = new Singleton();          }          return singleton;      }  }  </span>

用sychronized避免出现线程问题,但是消耗很大,所以,一般java中都是采用饿汉式,c中采用懒汉式


优点:

1.在内存中只有一个对象,节省内存空间

2.避免频繁的创建和销毁对象,提高性能

3.避免对共享资源的多重占用

4.全局访问



在Android中的应用

1.在应用编写的时候的Application

2.日历模块(CalendarDatabaseHelper)、输入法等等系统的应用

3.我用过一个Volley框架访问往来,它的队列就是单例模式RequestQueue requestQueue = BvinApp.getHttpQueue();(我这里用的是Application,其实写成单例更好,符合设计模式. . . . .)这样可以保证程序的周期之内只有一个队列





0 0