工作一年了,由于部门职责的限制,虽然也接触了数据库设计、黑白盒测试等工作,但是自己更多的从事编码工作,按照详细设计书上的说明去实现后台业务逻辑。刚开始还有些自己的思想,到最后任务量加大,原本的编码工作完全变成了“Ctrl + C”、“Ctrl + V”的“完美组合”。
最近决定学习一下设计模式,进行工作之余的自我“充电”。下面进入正题:先从最基础的设计模式——单态模式(Singleton)入手。
单态模式: 即Singleton,它可以保证在Java应用程序中,一个类Class只有一个实例存在。
《Head First-Design Pattern》一书中定义其作用如下:
The Singleton Pattern ensures a class has only one instance, and provides a global point of access it. (确保每个类只有一个实例,并提供它的全局访问点)
Singleton模式的使用可以节省资源,防止同一类创建多个重复的实例。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。
主要有两种形式:
第一种形式:
public class SingletonPattern {
// 构造方法私有化
private SingletonPattern (){}
// 在自己内部定义自己一个实例,注意这是private 只供内部调用
private static SingletonPattern instance = new SingletonPattern ();
// 这里提供了一个供外部访问本class的静态方法,可以直接访问
public static SingletonPattern getInstance() {
return instance;
}
}
第二种形式
public class SingletonPattern {
private static SingletonPattern singleton= null;
public static synchronized SingletonPattern getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次 //使用时生成实例,提高了效率!
if (singleton==null) {
singleton=new SingletonPattern();
}
return singleton;
}
}
使用SingletonPattern.getInstance()可以访问单态类。
第二中形式是lazy initialization,即第一次调用时初始SingletonPattern,以后就不用再生成了。
注意到lazy initialization形式中的synchronized,(这个很重要),如果没有synchronized,那么使用 getInstance()是有可能得到多个Singleton实例。
利用“double-checked locking”来减少getInstance()方法必须是sychronized的改进:
public class SingletonPattern {
/** Local Variable */
private static SingletonPattern singleton;
/**
* Private Constuctor
*/
private SingletonPattern () { }
// Get Instance Of SingletonPattern
public static SingletonPattern getInstance () {
if (singleton == null) {
synchronized (SingletonPattern.class) {
if (singleton == null) {
singleton = new SingletonPattern();
}
}
}
return singleton;
}
}
关于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的讨论,希望有什么好的见解,大家一起探讨。
测试:
public class SingletonPatternTest {
/**
* Test SingletonPattern Class
*/
public static void main(String[] args) {
// singleton1
SingletonPattern singleton1 = SingletonPattern.getInstance();
// singleton2
SingletonPattern singleton2 = SingletonPattern.getInstance();
// compare singleton1 to singleton2
if (singleton1 == singleton2) {
System.out.println("The Instance Of SingletonPattern Class is one-of-a-kind !!");
} else {
System.out.println("The Instance Of SingletonPattern Class is not one-of-a-kind !!");
}
}
}
输出结果:
The Instance Of SingletonPattern Class is one-of-a-kind !!
小弟出来乍到,有什么不对的地方请大家指出。不怕自己错,只怕错了自己不知道。o(∩_∩)o...