Sigleton java应用

[精华] Singleton 模式 在 Java 中的应用


http://www.chinaunix.net 作者:cinc发表于:2002-09-10 12:49:44
发表评论】 【查看原文】 【Java讨论区】【关闭】

[这个贴子最后由cinc在2002/09/0504:07pm编辑]

Singleton模式在Java中的应用
作者cinc2002-09-04

程序中经常有这样的要求,整个程序运行时只有一个实例被使用。
比如:数据库连接池,系统参数配置,JavaAPI中的Runtime,Calendar...
如何实现这种需求成为一个值得讨论的问题。

以往的做法,是在程序的某个类里面(比如是GlobalObject)建立一个这个此种类的实例,然后规定
所有需要用到此类的,都从GlobalObject那里获得,看下面的例子:

publicclassConnectionPoolManager{
publicConnectionPoolManager{
//dosomeinitializework
}
publicConnectiongetConnection(){
....
}
}

publicclassGlobalObject{
privateConnectionPoolManagerconnectionPoolManager&#59;
publicGlobalObject(){
connectionPoolManager=newConnectionPoolManager()&#59;
...
}
publicvoidgetConnectionPoolManager(){
returnconnectionPoolManager&#59;
}
}

publicclassQueryFunctions{
publicstaticCollectionfindStudentByName(Stringname){
ConnectionPoolManager=globalObject.getConnectionPoolManager()&#59;
Connectionconnection=connectionPoolManager.getConnection()&#59;
//querydatabase
}
}

但这样做有如下缺点:
其他人可能调用ConnectionPoolManager的构造函数自己建立一个数据库连接池,导致
程序中存在多个ConnectionPoolManager,人为的规定往往得不到好的实施。
GlobalObject其实就是一个C语言中的全局变量,与面向对象的方法相冲突。



因此,可以使用设计模式中的Singleton(单件)模式来完成以上的需求:
JavaAPI中的Runtime等等用的就是这种方法。
代码如下:

publicclassConnectionPoolManager{
privatestaticinstance=null&#59;
privateConnectionPoolManager(){
//dosomeinitializework
}
publicstaticsyncronizedvoidgetInstance(){
if(instance==null){
instance=newConnectionPoolManager()&#59;
}
returninstance&#59;
}
publicConnectiongetConnection(){
}
}

ConnectionPoolManager的使用

publicclassQueryFunctions{
publicstaticCollectionfindStudentByName(Stringname){
ConnectPoolManagerconnectionPoolManager=ConnectionPoolManager.getInstance()&#59;
Connectionconn=connectionPoolManager.getConnection()&#59;
//querydatabase
}
}

1.instance是私有的,开始时赋值为null,外部只有通过getInstance方法才能获得他。
2.构造方法是私有的,这点很重要,保证只有这个类自己才能够调用,其他的类无法调用此构造函数。
3.getInstance方法中:
if语句,保证只有一个instance存在
唯一的一个ConnectionPoolManager在第一次调用的时候被建立。


Java语言在设计的时候就使用了很多设计模式的思想,像Collection中的Iterator模式,
Event中的Observer模式,Applet中的Templete模式,对象创建时的Factory模式,这些
模式大多可以从Java的类的命名中体现出来,希望大家在学习Java时多注意对设计模式的学习。

参考:
设计模式:可复用面向对象软件的基础(GangofFour的DesignPattern经典)
ThinkinginPattern:http://www.mindview.net/Books/TIPatterns/还是BruceEckel写的。
DesignPatternJava:ftp://cinc.dns2go.com/pub/doc/pattern/java/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值