单例模式是比较重要的一种模式,其主要作用是系统中仅存在一个类的唯一实例。维基百科上面的说明比较不错:
單例模式,也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統只需要擁有一個的全局對象,這樣有利於我們協調系統整體的行為。比如在某個伺服器程序中,該伺服器的配置信息存放在一個文件中,這些配置數據由一個單例對象統一讀取,然後服務進程中的其他對象再通過這個單例對象獲取這些配置信息。這種方式簡化了在複雜環境下的配置管理。
还有一点也需要使用单例模式,就是针对系统比较重要的资源,比如数据库连接,网络IO连接等等。
原理:使用私有的构造函数,在该类的接口中构造一个对象。其他程序使用时,通过接口调用来获取单一类的实例即可。以下是实现方式:
1 基本实现:该实现在单线程环境中是可以使用的,但是到了多线程环境,其实很难保证该实例的单一。
package com.dev.design.singleton;
public class Service {
private Service(){}
private static Service service = null;
public static Service getServiceInstance(){
return service == null?new Service():service;
}
}
2 多线程环境实现:使用这种方式,在多线程环境中也可以保证实例的单一,但是只要使用这种方式,就会有同步,这样的话,在性能方面会有优化空间。
package com.dev.design.singleton;
public class Service2 {
private Service2(){}
private static Service2 service = null;
public static Service2 getServiceInstance(){
synchronized(service){
return service == null ? new Service2():service;
}
}
}
3 Double-Checked Locking :双重检查机制,这种实现方式就是目前最普遍的实现方式了。
package com.dev.design.singleton;
public class Service3 {
private Service3(){}
private static Service3 service = null;
public static Service3 getServiceInstance(){
if(service == null){
synchronized(service){
if(service == null){
service = new Service3();
}
}
}
return service;
}
}
目前先记录到这里,单例模式很值得研究,基本上每个系统都会使用到单例模式,还有该模式的性能研究,使用的研究等。
说一下,为什么是需要静态变量来持有单例呢?
我的理解:如果使用非静态的变量来持有,这样的话,很可能会被java语言的垃圾收集器收集了,等到下一次使用的时候,又要重新构造了。这样性能消耗太大,我想正是因为这个原因,才会考虑使用静态变量了。