首页 > 其他 > 详细

设计模式(02-单例模式)

时间:2014-03-10 12:42:48      阅读:428      评论:0      收藏:0      [点我收藏+]

在23种设计模式中,单例模式算是最简单的一种设计模式,该模式只使用了面向对象中封装的概念,主要解决的是创建多个对象的问题。

单例模式,顾名思义,就是只允许创建一个单独的实例。可能有人会说,这么简单的事情根本不需要一种设计模式,使用该类的开发人员控制自己只创建一个实例不就行了吗?这种做法虽然很简单,但是,个人认为在面向对象的设计中,这种约束应该是类的设计者的责任,而不是使用者的责任。所以,这种设计模式就应运而生了。

单例模式很简单,也比较容易理解,下面是单例模式的类图:

bubuko.com,布布扣

下面是一个比较简单的单例模式实现的代码:

bubuko.com,布布扣
 1 public class Singleton {
 2     private static Singleton instance = null;
 3 
 4     private Singleton() { }
 5 
 6     public static Singleton getSingleton {
 7         if( instance == null ) {
 8             instance = new Singleton();
 9         }
10         return instance;
11     }
12 }
bubuko.com,布布扣

  上面的代码只适合单线程的情况,如果在多线程的情况下,当第一个线程执行到第7行的时候,第二个线程也执行到这里,就会出现两个线程都判断instance为null,于是就会生成两个实例变量,不符合单例模式的要求。所以在多线程的情况下,需要对代码7 ~ 9行代码进行加锁,保证操作的原子性,下面是多线程情况的代码事例:

bubuko.com,布布扣
 1 public class Singleton {
 2     private static Singleton instance = null;
 3 
 4     private String lockHelper;
 5 
 6     private Singleton() { }
 7 
 8     public static Singleton getSingleton {
 9         synchronized( lockHelper ) {
10             if( null == instance ) {
11                 instance = new Singleton();
12             }
13         }
14 
15         return instance;
16     }
17 }
bubuko.com,布布扣

单例模式的核心目的就是控制实例的创建数目为一个,所以在相应的扩展中,如果说需要控制实例的数目为n(n为固定的个数),将各种实例都存放在某个数组中,然后根据用户的需求轮询的返回对应的实例,可以说是建立了一个简单的对象池。下面是简单的代码事例:

bubuko.com,布布扣
 1 public class Singleton {
 2     private int n = 5;
 3     private int count = 0;
 4     private boolean created = false;
 5 
 6     private static Singleton instance[] = new Singleton[n];
 7 
 8     private Singleton() { };
 9 
10     private void initSingleton() {
11         for( int i = 0; i < n; ++i ) {
12             instance[i] = new Singleton();
13         }
14     }
15 
16     public Singleton getSingleton() {
17         if( !created ) {
18             initSingleton();
19             created = true;
20         }
21 
22         return instance[count++ % n];
23     }
24 }
bubuko.com,布布扣

总体上来说,单例模式还是比较简单的设计模式,但是需要注意下面几点:

     1、普通的单例模式在多线程的情况工作可能会出现不正常的情况,所以需要针对多线程的情况进行相应的修改。

     2、实际的应用场景中,可能不是限制一个实例对象,而是限制创建n个,这种情况下,需要会对象池的含义以及使用。

     3、需要理解单例模式的核心内容是“如何防止用户随意的使用new对某个类构造器的任意使用”,理解这个核心内容,也就理解了单例模式,并且能够根据具体的情况进行相应的变动。

设计模式(02-单例模式),布布扣,bubuko.com

设计模式(02-单例模式)

原文:http://www.cnblogs.com/hanzejl/p/3590649.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!