文档章节

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

珂jack
 珂jack
发布于 05/16 14:29
字数 1009
阅读 1020
收藏 19

一、概念

    之前有讲过单例模式,多例模式实际上可以看作是单例模式推广。在多例模式中,多例类可以有多个实例,并且多例类要负责创建、管理并且向外提供自己的实例。多例模式可以分为无上限的多例模式和有上限的多例模式,这里我们只讲有上限的多例模式,因为无上限多例模式与我们平时自己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) {
        this.duty = duty;
    }

    //随机返回一个位置
    public static Position getInstance() {
        Random random = new Random();
        return POSITION_INFO.get(random.nextInt(POSITION_INFO.size()));//随机拉出一个位置
    }

    //返回指定位置
    public static Position getInstance(Integer code) {
        return POSITION_INFO.get(code);
    }

    //位置职责
    public String dutyInfo() {
        return duty;
    }
}

    我们看到多例类中有一个容器用来装所有位置信息,并且和单例模式一样拥有一个私有的构造方法,这个私有的构造方法是用来防止外部再产生位置对象,从而满足有上限这一条件。

    我们还能看到位置类中对外提供了一系列方法来获取到位置信息。

    接下来我们通过测试类测试一下:

public class Test {
    public static void main(String[] args) {
        Position position = Position.getInstance(2); //获取2号位置信息
        System.out.println(position.dutyInfo());  //打印2号位置职责

        Position position2 = Position.getInstance(5); //获取3号位置信息
        System.out.println(position2.dutyInfo());  //打印3号位置职责
    }
}

    可以看出输出的结果与我们预期一致。

五、优势

    同单例模式一样,多例模式同样减少了内存的开销,不再频繁的创建和销毁对象。

六、局限性

    也和单例模式类似,多例模式没有接口,不能继承。多例类既要关心内部逻辑又要关心外部如何来实例化它,违背了单一职责原则。当然了,世界上没有十全十美的模式,每个设计模式都有它适用的地方,只要我们的使用方式得当,那么多例模式可以帮助我们写出漂亮优雅的代码。

附源码地址:https://gitee.com/jack90john/multition

------------------------------------------------------------------------

欢迎关注我的个人公众号,推送最新文章

© 著作权归作者所有

共有 人打赏支持
珂jack
粉丝 41
博文 17
码字总数 21342
作品 0
成都
后端工程师
加载中

评论(5)

珂jack
珂jack

引用来自“开源中国首席睡觉专家”的评论

学设计模式看哪个好?大话设计模式吗?
我入门是看的《head first 设计模式》然后根据自己的理解放到自己设计的一个场景里去做一些衍生,还不错。
进击的代码
进击的代码

引用来自“开源中国首席效率专家”的评论

学设计模式看哪个好?大话设计模式吗?
说到设计模式的书,我个人首推 <设计模式之禅>,里面的例子都是生活中的,没那么枯燥,然后是大话设计模式
开源中国首席罗纳尔多
开源中国首席罗纳尔多
学设计模式看哪个好?大话设计模式吗?
珂jack
珂jack

引用来自“逆流de鱼”的评论

为什么不用枚举?

@逆流de鱼 根据情况来,都可以哈
逆流de鱼
逆流de鱼
为什么不用枚举?
软件体系结构作业一--单例模式

package text1;import java.awt.Color;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import......

yifon
2014/04/04
0
0
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei
05/26
0
0
通过例子来理解巧妙绝伦的工厂模式

每次读设计模式的书,都感觉自己收获颇多。《Head First 设计模式》在学校的时候就买下了,刚开始初学java的时候,经常问别人,设计模式有没有用,设计模式的好处在哪里。后来参加工作,在工...

夕水溪下
2012/12/04
0
0
ES7 Decorator 装饰者模式

原作者:玄农 装饰模式 设计模式大家都有了解,网上有很多系列教程,比如 JS设计模式等等。 这里只分享 装饰者模式 以及在 如何使用 ES7 的 概念 装饰模式 v.s. 适配器模式 装饰模式和适配器...

_朴灵_
05/14
0
0
C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子
2017/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

day58-20180816-流利阅读笔记-待学习

苹果市值破万亿,iPhone 会涨价吗? Lala 2018-08-16 1.今日导读 苹果教父乔布斯曾经说过:“活着就是为了改变世界。”虽然他在 56 岁时就遗憾离世,但他极具创新和变革的精神早已深埋进苹果...

aibinxiao
18分钟前
4
0
[雪峰磁针石博客]python3快速入门教程1 turtle绘图-2函数

菲波那契序列: >>> # Fibonacci series:... # the sum of two elements defines the next... a, b = 0, 1>>> while b < 10:... print(b)... a, b = b, a+b...112......

python测试开发人工智能安全
今天
0
0
java环境变量配置最正确的方式

原贴:https://blog.csdn.net/qq_40007997/article/details/79784711,十分详细,亲测有效

kitty1116
今天
0
0
49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

王鑫linux
今天
2
0
Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部