论坛首页 编程语言技术论坛

设计模式(四)——多例模式

浏览 4915 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-04  

设计模式(四)——多例模式

 

所谓多例(Multiton Pattern)实际上就是单例模式的自然推广。作为对象的创建模式,多例模式或多例类有以下的特点:
1、多例类可以有多个实例

2、多例类必须能够自我创建并管理自己的实例,并向外界提供自己的实例。

典型的例子就是数据库线程池,下面我就模拟一下用户取得线程池中连接的简化场景:

先设计这个产生连接的类

package com.gy.designpattern.multition;

import java.util.ArrayList;
import java.util.Random;

/**
 * ClassName:MyConnections <br/>
 * Function: 这个类用于产生多个connection. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2012-7-4 上午11:45:54 <br/>
 * @author   gongyong
 * @version
 * @since    JDK 1.6
 * @see
 */
public class MyConnections {
	/**
	 * maxNumOfConnection:允许产生的最大连接数.
	 * @since JDK 1.6
	 */
	private static int maxNumOfConnection = 5;
	/**
	 * connectionInfoList:装所有连接信息(就是编号)的List.
	 * @since JDK 1.6
	 */
	private static ArrayList<String> connectionInfoList=new ArrayList<String>(maxNumOfConnection);
	/**
	 * connectionList:装所有连接的List.
	 * @since JDK 1.6
	 */
	private static ArrayList<MyConnections> connectionList=new ArrayList<MyConnections>(maxNumOfConnection);

	/**
	 * currNumOfConnection:当前的连接号.
	 * @since JDK 1.6
	 */
	private static int currNumOfConnection =0;


	//私有构造方法
	private MyConnections(){
	}

	//私有构造方法
	private MyConnections(String info){
		connectionInfoList.add(info);
	}


	//把所有的连接都产生出来
	static{
	for(int i=0;i<maxNumOfConnection;i++){
		//放在connectionList中的对象和connectionInfoList中的信息是一一对应的
		//当然,完全可以去掉这个connectionInfoList,在这个类中设一个变量来保存这个信息
		connectionList.add(new MyConnections("我是连接:"+i+"号"));
		}
	}

	/**
	 * getInstance:返回任意一个连接. <br/>
	 * @author gongyong
	 * @return
	 * @since JDK 1.6
	 */
	public static MyConnections getInstance(){
		Random random=new Random();
		currNumOfConnection=random.nextInt(maxNumOfConnection);
		return (MyConnections)connectionList.get(currNumOfConnection);
	}

	/**
	 * connectionInfo:返回当前连接的信息. <br/>
	 * @author gongyong
	 * @since JDK 1.6
	 */
	public  void connectionInfo(){
		System.out.println(connectionInfoList.get(currNumOfConnection));
	}

}

 然后,是客户端,用于获取连接:

package com.gy.designpattern.multition;
/**
 * ClassName:Client <br/>
 * Function: 这是客户端,用于获取连接. <br/>
 * Reason:	 TODO ADD REASON. <br/>
 * Date:     2012-7-4 下午12:51:16 <br/>
 * @author   gongyong
 * @version
 * @since    JDK 1.6
 * @see
 */
public class Client {

	public static void main(String[] args){
		int userNum=10;
		for(int i=0;i<userNum;i++){

			//用户获取到的连接时随机的
			MyConnections conn= MyConnections.getInstance();
			System.out.print("第"+i+"个用户获得的连接是:");
			conn.connectionInfo();
		}
	}
}
 OK,就是这么简单!
   发表时间:2012-11-01  
不知道我理解的对不对,客户端是不是应该模拟多个用户同时访问才更好一点
0 请登录后投票
   发表时间:2012-11-07  
yyyysh310 写道
不知道我理解的对不对,客户端是不是应该模拟多个用户同时访问才更好一点

对,多例模式就是为了满足并发情况下对同一种资源的使用情况的
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics