多例模式中的多例类可以有多个实例,而且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。
一、多例模式的特点
所谓的多例模式,实际上就是单例模式的自然推广。作为对象的创建模式,多例模式或多例类有以下特点:①多例类可有多个实例;②多例类必须自己创建、管理自己的实例,并向外界提供自己的实例;
二、多例模式实例
1、有上限的多例类
一个实例数目有上限的多例类已经把实例的上线当做逻辑的一部分,并创造到了多例类的内部,这种多例模式叫做有上限多例模式。比如每一麻将牌局都需要有两个骰子,因此骰子就应当是双态类。以此为例,多例模式代码如下:
由于有上限的多例类对实例的数目是有上限,因此有上限的多列类在这个上限等于1时,多例类就回到了单例类。因此,多例类是单例类的推广,而单例类是多例类的特殊情况。一个有上限的多例类可以使用静态变量存储所有的实例,特别是在实例数目不多的时候,可以使用一个个静态变量存储一个个的实例。在数目较多的时候,就需要使用静态局聚集存储这些实例。
2、无上限多例模式
多例类的实例数目并不需要有上限,实例数目并没有上限的多例模式就叫做无上限多例模式。由于事先不知道要创建多少个实例,因此,必然使用聚集管理所有的实例。看(三)中实例。
三、多例模式常在的使用场景
1、在国际化问题中(多语言),简称i18n。常用到多例模式来辅助解决。下面是一个例子:
这个多例类的构造函数式私有化的,因此不能用new直接实例化。所有的实例必须通过调用静态getInstance()方法来得到。在调用getInstance()方法时,程序会检查传入的locale代码是否已经存在instances结合中,如果已存在,则直接返回对应的实例;如果不存在会先实例化一个实例并加入到集合中,然后返回这个实例。通过属性文件的配置,就可以通过代码,获取到相应的语言描述。
2、多例模式在java中的应用:NumberFormat实例如下
输出如下:
1,111.89 en_US
1.111,89 de_DE