深入浅出设计模式——从球赛中悟多例模式

摘要: 之前有讲过单例模式,多例模式实际上可以看作是单例模式推广。在多例模式中,多例类可以有多个实例,并且多例类要负责创建、管理并且向外提供自己的实例。

 

一、概念

之前有讲过单例模式,多例模式实际上可以看作是单例模式推广。在多例模式中,多例类可以有多个实例,并且多例类要负责创建、管理并且向外提供自己的实例。多例模式可以分为无上限的多例模式和有上限的多例模式,这里我们只讲有上限的多例模式,因为无上限多例模式与我们平时自己new对象没啥区别。

所谓有上限的多例模式就是多例类中的实例是有一个上限的,就好比足球场上一个队最多只能有11个运动员同时在场上踢球是一个道理。下面我们就按这个场景来介绍多例模式。

 

二、使用场景

在工作中需要用到池概念的地方就可以用多例模式来实现,比如我们常用的数据库连接池等。

 

三、结构

多例模式的结构和单例模式很相像,其实就是一个多例类,并不需要多余的依赖关系。

 

四、实现

首先我们需要写一个多例类,上面也有说到多例模式其实就是一个多例类,多例类写起来也相当简单:

public class Position {
    private static final Map<Integer, Position> POSITION_INFO;  //装场上位置信息的容器
    private String duty; //每个位置在场上有它对应的职责

    //先把5个位置分配出来(五人制足球在场上的五个位子和职责)
    static {
        Map<Integer, Position> map = new HashMap<>();
        map.put(1, new Position("1号位职责:把守球门!"));
        map.put(2, new Position("2号位职责:左路防守并协助进攻!"));
        map.put(3, new Position("3号位职责:右路防守并协助进攻!"));
        map.put(4, new Position("4号位职责:中场推进与进攻组织!"));
        map.put(5, new Position("5号位职责:进攻!"));
        POSITION_INFO = Collections.unmodifiableMap(map);
    }

    //构造函数需要把当前位置的职责写入
    private Position(String duty)