现在的位置: 首页 > 综合 > 正文

Singleton模式

2018年05月06日 ⁄ 综合 ⁄ 共 1497字 ⁄ 字号 评论关闭

定义:
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。

还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。

另外方面,Singleton也能够被无状态化。提供工具性质的功能,
Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。
我们常常看到工厂模式中类装入器(class loader)中也用Singleton模式实现的,因为被装入的类实际也属于资源。

 

系统中你需要获得某个类的唯一实例,所有客户端对它的访问都将通过一个公共的访问点获得;
 *  创建一个类并使其:(A)定义一个私有的构造器;
 *                  (B)定义一个私有、静态的变量指向自己;
 *                  (C)定义一个公有、静态的访问方法用于返回该类的一个唯一实例.

 

一般Singleton模式通常有几种形式:

第一种形式:

package cn.com.singleton;
public class Singleton {
 // 提供一个静态私有变量指向自己,属于类
private static Singleton instance = new Singleton();
 // 提供私有构造器,只有在当前类中可以使用new,外界不能构造该类的对象 
private Singleton(){}

  // 对外提供一个公共访问点   
 public static Singleton getInstance()
 {
 return instance;
 }
}

 

 

 

第二种形式:
 

public class Singleton{
 // 提供一个静态私有变量指向自己,属于类
 private static Singleton instance = null;
 
 // 提供私有构造器,只有在当前类中可以使用new,外界不能构造该类的对象
 Singleton()
 {}

 //synchronized避免在访问量比较大的时候 第一个线程的new Singleton还没来得及赋值给instance,第二个线程就来了,还要进行new ……
 public synchronized static Singleton getInstance()
 {
  if(instance == null)
  {
   instance = new Singleton();
  }
  
  return instance;
 }

 

}

说明:第二中方式比第一种方式有所改进,不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率!(一般认为第一种形式要更加安全些)

 

 

测试类:

package cn.com.singleton;

public class ClientTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Singleton s1 = Singleton.getInstance();
  Singleton s2 = Singleton.getInstance();
  
  System.out.println(s1);
  System.out.println(s2);
 }
}

抱歉!评论已关闭.