一起学习
程序中经常有这样的要求,整个程序运行时只有一个实例被使用。
比如:数据库连接池,系统参数配置,Java API 中的 Runtime, Calendar ...
如何实现这种需求成为一个值得讨论的问题。
以往的做法,是在程序的某个类里面(比如是 GlobalObject )建立一个这个此种类的实例,然后规定
所有需要用到此类的,都从 GlobalObject 那里获得,看下面的例子:
public class ConnectionPoolManager {
public ConnectionPoolManager {
// do some initialize work
}
public Connection getConnection(){
....
}
}
public class GlobalObject {
private ConnectionPoolManager connectionPoolManager;
public GlobalObject () {
connectionPoolManager = new ConnectionPoolManager();
...
}
public void getConnectionPoolManager() {
return connectionPoolManager;
}
}
public class QueryFunctions {
public static Collection findStudentByName(String name){
ConnectionPoolManager = globalObject.getConnectionPoolManager();
Connection connection = connectionPoolManager.getConnection();
// query database
}
}
但这样做有如下缺点:
其他人可能 调用 ConnectionPoolManager 的构造函数自己建立一个 数据库连接池,导致
程序中存在多个 ConnectionPoolManager,人为的规定往往得不到好的实施。
GlobalObject 其实就是一个 C 语言中的全局变量,与面向对象的方法相冲突。
因此,可以使用 设计模式 中的 Singleton (单件)模式来完成以上的需求:
Java API 中的 Runtime 等等用的就是这种方法。
代码如下:
public class ConnectionPoolManager {
private static instance = null;
private ConnectionPoolManager() {
// do some initialize work
}
public static void getInstance() {
if (instance == null){
instance = new ConnectionPoolManager();
}
return instance;
}
public Connection getConnection(){
}
}
ConnectionPoolManager 的使用
public class QueryFunctions {
public static Collection findStudentByName(String name){
ConnectPoolManager connectionPoolManager = ConnectionPoolManager.getInstance();
Connection conn = connectionPoolManager.getConnection();
// query database
}
}
1.instance 是私有的,开始时赋值为 null,外部只有通过 getInstance 方法才能获得他。
2.构造方法是私有的,这点很重要,保证只有这个类自己才能够调用,其他的类无法调用此构造函数。
3.getInstance 方法中:
if 语句,保证只有一个 instance 存在
唯一的一个 ConnectionPoolManager 在第一次调用的时候被建立。
下面是另一个例子: java.lang.Runtime
我刚看了 Runtime 的实现如下:
public class Runtime {
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
/** Don‘t let anyone else instantiate this class */
// 够狠
private Runtime() {}
}
它在定义变量时创建 唯一的 Runtime 实例。
Java语言在设计的时候就使用了很多 设计模式的思想,像 Collection 中的 Iterator 模式,
Event 中的 Observer 模式,Applet 中的 Templete 模式,对象创建时的 Factory 模式,这些
模式大多可以从 Java 的类的命名中体现出来,希望大家在学习 Java 时多注意对 设计模式 的学习。
参考:
设计模式:可复用面向对象软件的基础 (Gang of Four 的 Design Pattern 经典)
Thinking in Pattern : 还是 Bruce Eckel 写的。
Design Pattern Java : ftp://cinc.dns2go.com/pub/doc/pattern/java
下载本文示例代码
Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用Singleton 模式在 Java 中的应用
阅读(131) | 评论(0) | 转发(0) |