第四梦 多例模式
Posted yrml
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四梦 多例模式相关的知识,希望对你有一定的参考价值。
邂逅多例
多例在我们日常编写程序过程中可能相对用到得少一些,但是其起到的作用并不小。就比如我们日常接触到的数据库连接池就是多例模式的一种实现,还有EJB无状态会话Bean的实例池。
为什么使用多例
在多并发的请求环境下,系统需要为每个客户端的独立请求提供单独服务的资源,但是系统开销总是有限的,系统在并发量很大时也不可能为所有的并发请求提供相应的资源。这个时候就考虑使用多例的方式来分配资源回收资源再分配,从而达到减轻系统的压力。
代码操作
1、提供容器类,也就是池的概念
2、通过读取配置好的一些属性来进行对池进行初始化
3、程序请求时,先判断池中有无空闲的链接资源,有则返回该资源,没有,则新建连接对象。
简单的代码实战(比池的实现简单的多)
1、定义MultitionPattern类,用来生产固定数量的实例化对象(注意看我的注释)
1 package com.yrml.multition; 2 3 import com.google.common.collect.Lists; 4 5 import java.util.List; 6 import java.util.Random; 7 8 /** 9 * @author created by John Tan on 2018/6/14 10 */ 11 public class MultitionPattern { 12 13 /** 14 * 最多实例化个数 15 */ 16 private static final int MAX_NUMBER_OF_MUTITION = 3; 17 private static List<String> multitionInfoList = Lists.newArrayListWithExpectedSize(MAX_NUMBER_OF_MUTITION); 18 private static List<MultitionPattern> multitionList = Lists.newArrayListWithExpectedSize(MAX_NUMBER_OF_MUTITION); 19 /** 20 * 当前使用的实例化对象 21 */ 22 private static int countNumberOfMultition = 0; 23 24 //首先把所有的对象都实例化 25 static { 26 for(int i = 0; i < MAX_NUMBER_OF_MUTITION; i++){ 27 multitionList.add(new MultitionPattern("Multition" + (i+1) + "号")); 28 } 29 } 30 31 private MultitionPattern() { 32 } 33 34 private MultitionPattern(String info) { 35 multitionInfoList.add(info); 36 } 37 38 /** 39 * 随机的获取一个实例化对象 40 * @return 实例化对象 41 */ 42 public static MultitionPattern getInstance(){ 43 Random random = new Random(); 44 countNumberOfMultition = random.nextInt(MAX_NUMBER_OF_MUTITION); 45 return multitionList.get(countNumberOfMultition); 46 } 47 48 /** 49 * 通过对象标识获取指定的实例化对象 50 * @param multition 对象标识 51 * @return 实例化对象 52 */ 53 public static MultitionPattern getInstance(int multition){ 54 countNumberOfMultition = multition; 55 return multitionList.get(countNumberOfMultition); 56 } 57 58 /** 59 * 该实例化对象相关的信息 60 * @return information 61 */ 62 public String multitionInfo(){ 63 return multitionInfoList.get(countNumberOfMultition); 64 } 65 66 }
2、通过Caller对实例化好的对象进行调用(两种方式调用【随机&指定】)
1 package com.yrml.multition; 2 3 /** 4 * @author created by John Tan on 2018/6/14 5 */ 6 public class Caller { 7 8 private static final int CALLER_NUMBER = 8; 9 10 private static void randomCaller(){ 11 System.out.println("------------random---------------"); 12 for (int i = 0; i < CALLER_NUMBER; i++) { 13 MultitionPattern multitionPattern = MultitionPattern.getInstance(); 14 System.out.println("第" + (i+1) + "个调用:" + multitionPattern.multitionInfo()); 15 } 16 } 17 18 private static void pointCaller(){ 19 System.out.println("------------point---------------"); 20 for (int i = 0; i < CALLER_NUMBER; i++) { 21 MultitionPattern multitionPattern = null; 22 if(i < 3){ 23 multitionPattern = MultitionPattern.getInstance(0); 24 } else if(i < 5){ 25 multitionPattern = MultitionPattern.getInstance(1); 26 } else { 27 multitionPattern = MultitionPattern.getInstance(2); 28 } 29 System.out.println("第" + (i+1) + "个调用:" + multitionPattern.multitionInfo()); 30 } 31 } 32 33 public static void main(String[] args) { 34 Caller.randomCaller(); 35 Caller.pointCaller(); 36 } 37 }
GitHub位置
实战demo请点击这里。
写在后面
后期有必要看一下各种工具对线程池的实现,对比学习一下,理解应该会深些,Mark、、
以上是关于第四梦 多例模式的主要内容,如果未能解决你的问题,请参考以下文章