| |
| Singleton 模式在 Java 中的应用 |
| |
发布者: 发布时间:2007-11-26 |
|
|
|
程序中经常有这样的要求,整个程序运行时只有一个实例被使用。比如:数据库连接池,系统参数配置,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 : http://www.mindview.net/Books/TIPatterns/ 还是 Bruce Eckel 写的。Design Pattern Java : ftp://cinc.dns2go.com/pub/doc/pattern/java
|
| (转载文章请保留出处:北天JAVA技术网(www.java114.com)) |
| |
| 更多精彩文章: |
| J2EE设计模式浅谈(二)之Filter |
| Adapter模式在J2SE事件处理中的应用 |
| 设计模式之父谈如何使用设计模式 |
| AOP是什么? |
| JDBC-ODBC桥 |
| ATM银行取款机模拟程序(可连接数据库) |
| |
| 最近评论: |
|
|
| 鍥炲 |
|
|
|
| 那个雨天的想法! |
| wow gold,wow power leveling.wow power leveling,wow power leveling,
max(7355) |
|
|
| 如果真的有来生! |
| 四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游,
max(1349) |
|
|
| 左边的风景! |
| wow gold,wow power leveling.wow power leveling,wow power leveling,
max(5559) |
|
|
| 轻轻走过你的窗前! |
| world of warcraft gold,cheap world of warcraft gold,warcraft gold,world of warcraft gold,cheap world of warcraft gold,warcraft gold, max(2680) |
|
|
| 轻轻走过你的窗前! |
| world of warcraft gold,cheap world of warcraft gold,warcraft gold,world of warcraft gold,cheap world of warcraft gold,warcraft gold max(7848) |
|
|
| 不在的哪天! |
| final fantasy xi gil,final fantasy xi gil,final fantasy xi gil,final fantasy xi gil,
max(5446) |
|
|
| 快乐情人节! |
| wow gold,wow gold,wow gold,wow gold,wow gold,wow gold,wow gold buy wow gold for cheap.
max(7747) |
|
|
| 昨夜的狂想曲! |
| wow gold,WoW Gold,world of warcraft gold,WoW Gold, max(3584) |
|
|
| 没有情人的情人节! |
| wow gold,wow power leveling.wow power leveling,wow power leveling,
max(6493) |
|
|
| |
| 免责声明:该文章由网友发表,如果对您造成侵权,请联系站长。 |
|