单例模式--独一无二的对象

时间:2017-06-17 20:05:49   收藏:0   阅读:168

1.单例模式的定义

单例模式(Singleton Pattern):用来创建独一无二的,只能有一个实例的对象的入场券。

在我们进行开发的时候,有些对象我们只需要一个,比如:配置文件,工具类,线程池、缓存、日志对象等。如果创造出多个实例,就会导致许多问题,比如占用资源过多,不一致的结果等。使用单例模式就能保证在程序中需要的实例只有一个。

单例模式的类型:懒汉模式、饿汉模式。

 

2.单例模式的类图

下面是单例模式的类图:

技术分享

我们将创建一个单例对象类 - Singleton。单例对象(Singleton)类的构造函数是私有的,并且具有自身的静态实例。

Singleton类提供了一个静态方法来获取其静态实例到外部世界。SingletonTest或示例类将使用Singleton类提供的静态方法来获取Singleton对象。

3.单例模式--饿汉式

饿汉式是在创建自身的静态实例的时候就直接实例化单例对象,然后在提供的静态方法中直接返回这个实例对象。

 1 /**
 2  * 单例模式(饿汉模式)
 3  * @author admin
 4  *
 5  */
 6 public class Singleton {
 7     //1.将构造方法私有化,不允许外部直接创建对象
 8     private Singleton(){
 9         }
10     
11     //2.创建类的唯一实例,使用private,static修饰
12     private static Singleton instance = new Singleton();
13     
14     //3.提供一个用于获取实例的方法,使用public static 修饰
15     public static Singleton getInstance(){
16         return instance;
17     }
18 }    

4.单例模式-懒汉式

懒汉式在创建自身的静态实例的时候不直接实例化单例对象,只有在外部调用获取单例对象的静态方法的时候才会判断单例对象是否已经存在,如果 不存在则创建一个并返回,如果已经存在则直接返回。

 1 /**
 2  * 单例模式(懒汉模式)
 3  * @author admin
 4  */
 5 public class Singleton2 {
 6     //1.将构造方法私有化,不允许外边直接创建对象
 7     private Singleton2(){
 8     }
 9     //2.声明类的唯一实例,使用private,static修饰,但是此处不实例化
10     private static Singleton2 instance;
11     //3.提供一个用于获取实例的方法,使用public static修饰
12     public static Singleton2 getInstance(){
13         if (instance == null) {
14             instance = new Singleton2();
15         }
16         return instance;
17     }
18 }

 

 

5.测试

 1 /**
 2  * 单例模式的测试类
 3  * @author admin
 4  *
 5  */
 6 public class SingletonTest {
 7     public static void main(String[] args) {
 8         //饿汉模式
 9         Singleton s1 = Singleton.getInstance();
10         Singleton s2 = Singleton.getInstance();
11         
12         if (s1 == s2) {
13             System.out.println("s1和s2是同一个对象");
14         }else {
15             System.out.println("s1和s2不是同一个对象");
16         }
17         
18         //懒汉模式
19         Singleton2 s3 = Singleton2.getInstance();
20         Singleton2 s4 = Singleton2.getInstance();
21         if (s3 == s4) {
22             System.out.println("s3和s4是同一个对象");
23         }else {
24             System.out.println("s3和s4不是同一个对象");
25         }
26     }
27 }

 

测试结果:

技术分享

从测试结果可以看出来,获取的对象是同一个对象,也就是说,返回的是单例对象。

6.饿汉式和懒汉式的区别

  1. 饿汉式是在单例类加载的时候就初始化单例对象,所以在加载类的时候速度比较慢,但是在运行时的速度比较快,同时是线程安全的(线程安全问题下面再详细讲解)。
  2. 懒汉式在单例类加载的时候只定义单例对象,不进行初始化,所以加载类的时候速度比较快,但是在运行时需要进行单例对象的初始化,所以在运行时速度比较慢,而且是线程不安全的。

7.单例模式在多线程中的问题

上面的代码在普通的应用程序中没有任何任何问题,但是在多线程中使用的时候就会发现,返回的单例对象并不是唯一的,而且多个不同的单例对象,这就说明在多线程中,单例模式产生的单例对象并不是"唯一"的。要解决这个问题,有3种办法(其中两种方法都是针对懒汉式的),这3种方法在解决多线程问题的同时也有自己的缺点:

好了单例模式的叙述到此就结束了,如果有什么讲解的不正确的地方,欢迎大家多多指教!

文章部分内容引用自如下地址:http://www.yiibai.com/design_pattern/singleton_pattern.html

 

原文:http://www.cnblogs.com/gouyadong/p/6947332.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!