Singleton 模式 在 Java连接池中的应用

程序中经常有这样的要求,整个程序运行时只有一个实例被使用。
比如:数据库连接池,系统参数配置,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 syncronized 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语言在设计的时候就使用了很多 设计模式的思想,像 Collection 中的 Iterator 模式,
Event 中的 Observer 模式,Applet 中的 Templete 模式,对象创建时的 Factory 模式,这些
模式大多可以从 Java 的类的命名中体现出来,希望大家在学习 Java 时多注意对 设计模式 的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值