第四梦 多例模式

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 }
View Code

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 }
View Code

GitHub位置

实战demo请点击这里

写在后面

后期有必要看一下各种工具对线程池的实现,对比学习一下,理解应该会深些,Mark、、

以上是关于第四梦 多例模式的主要内容,如果未能解决你的问题,请参考以下文章

单例模式和多例模式

单例模式和多例模式的区别(转)

多例模式

多例模式

多例设计模式

Spring 单例模式和多例模式