定义:
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);
}
}