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


声明:本文转载自https://my.oschina.net/jack90john/blog/1813483,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

一、概念

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

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

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

本文发表于2018年05月16日 18:00
(c)注:本文转载自https://my.oschina.net/jack90john/blog/1813483,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1539 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1