登陆注册
8183300000054

第54章 5 单体模式的不同表现形式

大B:“你知不知道单体模式有哪些不同表现形式?”

小A:“我知道。不同表现形式:1、饿汉式单体类:类被加载的时候将自己初始化。更加安全些。2、懒汉式单体类:在第一次被引用的时候将自己初始化。提高了效率。3、多例类(多例模式):除了可以提供多个实例,其他和单体类没有区别。”

大B:“不错,我再详细说给你听吧!”

单体模式的不同表现形式之:多例类(多例模式)

所谓多例(Multiton Pattern)实际上就是单例模式的自然推广。作为对象的创建模式,多例模式或多例类有以下的特点:

1、多例类可以有多个实例

2、多例类必须自己创建,管理自己的实例,并向外界提供自己的实例。这种允许有限个或无限个实例,并向整个JVM提供自己实例的类叫做多例类,这种模式叫做多例模式。

(1)有上限多例模式。有上限的多例类已经把实例的上限当作逻辑的一部分,并建造到了多例类的内部,这种多例模式叫做有上限多例模式。

import java。util。Random;

import java。util。Date;

public class Die

{

private static Die die1=new Die();

private static Die die2=new Die();

/ *私有的构造函数保证外界无法直接将此类实例化

*

*/

private Die()

{

}

/ *工厂方法

*/

public static Die getInstance(int whichOne)

{

if(whichOne……1)

{

return die1;

}else{

return die2;

}

}

/ *投骰子,返回一个在1~6之间的随机数

*/

public synchronized int dice()

{

Date d=new Date();

Random r=new Random(d。getTime());

int value=r。nextInt();//获取随机数

value=Math。abs(value);//获取随机数的绝对值

value=value%6;//对6取模

value+=1;//由于value的范围是0~5,所以value+1成为1~6

return value;

}

}

/ *测试的客户端,投掷骰子

*/

public class DieClient

{

private static Die die1,die2;

public static void main(String[]args)

{

die1=Die。getInstance(1);

die2=Die。getInstance(2);

System。out。println(die1.dice());

System。out。println(die2.dice());

}

}

import java。util。Random;

import java。util。Date;

public class Die

{

private static Die die1=new Die();

private static Die die2=new Die();

/ *私有的构造函数保证外界无法直接将此类实例化

*

*/

private Die()

{

}

/ *工厂方法

*/

public static Die getInstance(int whichOne)

{

if(whichOne……1)

{

return die1;

}else{

return die2;

}

}

/ *投骰子,返回一个在1~6之间的随机数

*/

public synchronized int dice()

{

Date d=new Date();

Random r=new Random(d。getTime());

int value=r。nextInt();//获取随机数

value=Math。abs(value);//获取随机数的绝对值

value=value%6;//对6取模

value+=1;//由于value的范围是0~5,所以value+1成为1~6

return value;

}

}

/ *测试的客户端,投掷骰子

*/

public class DieClient

{

private static Die die1,die2;

public static void main(String[]args)

{

die1=Die。getInstance(1);

die2=Die。getInstance(2);

System。out。println(die1.dice());

System。out。println(die2.dice());

}

}

(2)无上限多例模式。例数目没有上限的多例模式叫无上限多例模式。

注意:由于没有上限的多例类对实例的数目是没有限制的,因此,虽然这种多例模式是单例模式的推广,但是这种多例类并不一定能够回到单例类。于是先不知道要创建多少个实例,因此,必然使用聚集管理所有的实例。

例子:购物车

import java。util。ArrayList;

import java。util。HashMap;

public class ShoppingCart{

private ShoppingCart shoppingCart=null;

//使用HashMap聚集管理所有的实例;

private static HashMap《String,ShoppingCart》instanse=new HashMap《String,ShoppingCart》();

//订单列表

private ArrayList《ItemOrder》orderedItems=null;

//更新器

private int readCount=0;

/ *同单例类一样,私有的构造函数保证外界无法直接将此类实例化

*

*/

private ShoppingCart(){

orderedItems=new ArrayList《ItemOrder》();

}

/*

*获取购物车,一个用户只能有一个购物车。有多少用户就有多少购物车。

**/

public synchronized static ShoppingCart getInstance(String user){

ShoppingCart shoppingCart=instanse。get(user);

if(shoppingCart……null){

shoppingCart=new ShoppingCart();

instanse。put(user,shoppingCart);

}

return shoppingCart;

}

/*

*用户退出登陆的时候,通过外部调用将购物车移除。

**/

public synchronized void removeShoppingCart(String key){

instanse。remove(key);

}

/*

*获取购物车中订单列表(orderedItems)

**/

public ArrayList《ItemOrder》getOrderedItems(){

readIn();

readOut();

return orderedItems;

}

/*

*管理订单。

*如果是旧订单则更新其数量。

*如果是新订单则添加到订单列表中。

**/

public void addItem(String itemId){

updateIn();

ItemOrder order;

for(int i=0;i0){

try{

wait();

}catch(Exception e){

}

}

}

private synchronized void readIn(){

readCount++;

}

private synchronized void readOut(){

readCount――;

notifyAll();

}

}

例子:购物车

import java。util。ArrayList;

import java。util。HashMap;

public class ShoppingCart{

private ShoppingCart shoppingCart=null;

//使用HashMap聚集管理所有的实例;

private static HashMap《String,ShoppingCart》instanse=new HashMap《String,ShoppingCart》();

//订单列表

private ArrayList《ItemOrder》orderedItems=null;

//更新器

private int readCount=0;

/ *同单例类一样,私有的构造函数保证外界无法直接将此类实例化

*

*/

private ShoppingCart(){

orderedItems=new ArrayList《ItemOrder》();

}

/*

*获取购物车,一个用户只能有一个购物车。有多少用户就有多少购物车。

**/

public synchronized static ShoppingCart getInstance(String user){

ShoppingCart shoppingCart=instanse。get(user);

if(shoppingCart……null){

shoppingCart=new ShoppingCart();

instanse。put(user,shoppingCart);

}

return shoppingCart;

}

/*

*用户退出登陆的时候,通过外部调用将购物车移除。

**/

public synchronized void removeShoppingCart(String key){

instanse。remove(key);

}

/*

*获取购物车中订单列表(orderedItems)

**/

public ArrayList《ItemOrder》getOrderedItems(){

readIn();

readOut();

return orderedItems;

}

/*

*管理订单。

*如果是旧订单则更新其数量。

*如果是新订单则添加到订单列表中。

**/

public void addItem(String itemId){

updateIn();

ItemOrder order;

for(int i=0;i0){

try{

wait();

}catch(Exception e){

}

}

}

private synchronized void readIn(){

readCount++;

}

private synchronized void readOut(){

readCount――;

notifyAll();

}

}

同类推荐
  • 体感交互技术

    体感交互技术

    本书提出了体感计算的研究,探讨了基于体验性认知的个性化电子学习方式,并且分析了面向儿童的艺术创造体验,在体感虚拟化身的帮助下,用户可以通过身体运动,促进情感心智的全面发展,
  • 如何建设网站

    如何建设网站

    本书以问答的方式介绍了建设网站的基本知识,内容包括:网站设计的八个步骤、建设网站需要掌握的工具软件、网页中插入图像、在网页中隐藏内容等。
  • 中文版AutoCAD2005建筑绘图精讲精学

    中文版AutoCAD2005建筑绘图精讲精学

    本书从中文版AutoCAD2005建筑绘图的基础进行介绍,讲解了建筑绘图的环境设置、二维建筑图形的绘制、二维建筑及装饰图形的编辑、建筑绘图中的文字标注和图形查询、建筑装潢平面图中的尺寸标注、建筑绘图中图块的应用、建筑平面图的绘制、建筑立面图的绘制、建筑剖面图的绘制、建筑绘图中的三维造型、三维建筑模型绘制及建筑图纸的布局与打印输出等内容。
  • 多媒体技术

    多媒体技术

    多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术
  • 从平凡到神奇

    从平凡到神奇

    本书结合多年的开店经验,全面地讲解了在淘宝网开设店铺的相关知识,为准备在淘宝网创业的卖家及刚刚创建店铺的店主,提供全面的开店和经营方面的指导。本书按照淘宝开店的流程安排内容,侧重每个步骤中的实际技巧。本书分3个部分:如何在淘宝开店、如何开好店、如何做强做大店铺。前3章介绍了在淘宝网开设店铺的基础知识,指导读者在开设店铺前做好准备工作,以及建立起自己的店铺,并且完成店铺的第一笔交易;第4章至第7章主要介绍了网店装修和推广的方法,以及网店的物流经验和技巧;第8章着重介绍了将网店做大做强的方法,帮助卖家在开店和经营中树立品牌意识,做大做强自己的店铺。
热门推荐
  • 十二星女孩

    十二星女孩

    【已暂停更新,勿入坑】据说,十二个星座都有一对星座王者,他们与她们是上天的宠儿,没有什么比他们厉害的,也没有什么会让他们害怕,可是,那个例外出现了。他们与她们性格迥异,却可以成为出生入死的兄弟与姐妹。当狮子女王者找到其他的王者会怎么样呢?当他们齐聚一起,发现了一个惊天大秘密……(本文纯属虚构,请勿模仿)
  • 题东山子李適碑阴二

    题东山子李適碑阴二

    本书为公版书,为不受著作权法限制的作家、艺术家及其它人士发布的作品,供广大读者阅读交流。
  • 暗自喜欢你很久了

    暗自喜欢你很久了

    有一个女孩,一直默默地关注着你。她很爱很爱你。有一个男孩,一直默默地关注着另一个她。他很爱很爱那个她。“他爱她,她爱他,她不爱他。”谨慎入坑//并不甜注意!!有两个她,不同一个人!!!
  • 夫人是个斯文败类类

    夫人是个斯文败类类

    【商业大佬斯文败类女主VS偏执痴情男主】“啪——”的一声双手被禁锢举到头顶上,整个身子被抵到一个黑黑的墙角里……“姐姐~你说你喜欢听我这样叫你吗?”四爷,名白,字笙,表面一副良人无畜温润清雅,实则性格恶劣,为达目的不择手段,更是一位偏执大佬……黑夜,月光皎洁,弥漫着深夜的喧嚣温斯情身着一袭黑裙,气质优雅寡淡,人如其名,斯文又寡情此刻,她被一位‘来历不明的’小子堵在了墙角真的是……她莞尔一笑“弟弟看上去也没有那么大嘛~却这么的懂事,一上来就喊人,叫姐姐~”呵——他低沉道“一切的阴谋,只不过是早有所图”背对着月光,对她无限温柔【不是一见钟情,小虐怡情,不算狗血,简介无能看书】
  • 九梵莲相

    九梵莲相

    前世,他以血泪祈愿,一世孤苦寂寞。今生,他以爱作祭,亲手断了生机与缘法。前世,她虔诚叩拜,修得一生正果。今生,她沦为魑魅妖邪,甘愿魂飞魄散、不得善终。两世缘劫,不见不念。金身正果,看破尘缘。只我不见,只我不念。情深清浅,不由姻缘。
  • 辣手小天师

    辣手小天师

    一个不入流的小医生,却掌握着最强神针术!治绝症,转生死,只在弹指之间!土豪见了他要亲自递烟,大佬见了他要客气敬酒,然而,更多的敌人却也虎视眈眈!什么,有人要来杀我?陈禹轻轻一笑,告诉他们,来的时候自己要背上一口棺材!
  • 明鹿鼎记

    明鹿鼎记

    天启四年,木匠皇帝只剩下三年寿命,崇祯眼下还只是信王。天启四年,他还在山海卫种田打猎,为他的科举路攒着路费。天启四年,他遥望顺天府,仿佛看到了那里的灯红酒醉,夜夜笙歌。我这一生,不信命运,不畏生死,只求轰轰烈烈,快意逍遥。
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • S女出没,注意!(一一向前冲)

    S女出没,注意!(一一向前冲)

    中国版的电台金三顺故事。灰姑娘的奋斗故事,嘻嘻哈哈,调侃言情。爱情永远是一个梦想,来看看周一一的版本有何不同。\r周一一本是购物频道主持人,被好友撬掉男友后,挥泪告别荧屏,误打误撞来到一个快要倒闭的999电台,她遇到了同事马路,他们毕生的梦想就是打倒全城最红的1088电台,但是,这怎么可能?\r更要命的是,周一一遇到了一个无礼的男人,而他,居然就是1088最红的男DJ——好戏开始了……\r
  • 凤九歌

    凤九歌

    《山海经·大荒北经》中说:"大荒之中,有山名曰北极柜。海水北注焉。有神九首,人面鸟身,句曰九凤"。那年初夏,看着父亲躺在血泊里的身影,九歌的眼红了,我是你师叔,你父亲把你交给我了,我会把我会的全部交给你,”初夏的夜晚,他对着哭泣的她说“别怕,有我在!”如同承诺,让人心安,可是为什么,为什么,你是师叔,师叔,你不是跟我说有你在么,那么,,你现在。。。在哪里。。。。