fancydeepin
毋意,毋必,毋固,毋我。
BlogJava
首页
新随笔
联系
聚合
管理
随笔-126 评论-247 文章-5 trackbacks-0
java 多例模式:单例模式的推广
多例模式
实际上就是
单例模式
的推广,多例模式又划分为
有上限多例模式
和
无上限多例模式
两种,有上限多例模式中的多例类的实例是有上限的,
当这个多例类中的上限数值上等于 1 时,此时,多例类退化回到了单例类;而对于无上限多例模式中的多例类,它的上限是没有限制的,也就是说它的上限数值是不确定的,
这个多例类并不一定能够退化成单例类;
单例模式与多例模式一般性结构:
多例模式特点:
1. 多例类可以有多个实例
2. 多例类必须自己创建自己的实例,并管理自己的实例,和向外界提供自己的实例
多例类的一个实例,比如:一副麻将都需要有两颗骰子,在没有特别意外发生的情况下,这副麻将打多少圈用的都将是这两颗骰子,两颗骰子代表的是不同的两个状态,
这里可以将骰子设计成多例类,如图:
多例类:Dice.java
package
pattern.multion;
import
java.util.Random;
/**
* -----------------------------------------
* @描述 骰子有上限多例类
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-7-31 <p>
* -----------------------------------------
*/
public
class
Dice
{
public
static
final
int
INSTANCE1
=
0
;
public
static
final
int
INSTANCE2
=
1
;
private
static
final
Dice DICE_INSTANCE1
=
new
Dice();
//
饿汉式
private
static
final
Dice DICE_INSTANCE2
=
new
Dice();
//
饿汉式
//
私有化构造子,阻止外部直接实例化对象
private
Dice()
{
}
/**
* <B>方法描述:</B>
* <p style="margin-left:20px;color:#A52A2A;">
* 获取多例类的实例
*
@param
which <span style="color: #008080;"> 取值范围:<BR>
* ① Dice.INSTANCE1:返回Dice的第一个实例对象<BR>
* ② Dice.INSTANCE2:返回Dice的第二个实例对象<BR>
* </span>
*
@return
<span style="color: #008080;"> 返回Dice的一个实例对象 </span>
*/
public
static
Dice getInstance(
int
which)
{
switch
(which)
{
case
INSTANCE1 :
return
DICE_INSTANCE1;
case
INSTANCE2 :
return
DICE_INSTANCE2;
default
:
try
{
throw
new
Exception(
"
找不到与参数
"
+
which
+
"
相匹配的实例!
"
);
}
catch
(Exception e)
{e.printStackTrace();}
}
return
null
;
}
/**
* <B>方法描述:</B>
* <p style="margin-left:20px;color:#A52A2A;">
* 此方法是线程安全的,调用该方法来掷骰子
*
@return
<span style="color: #008080;"> 返回骰子的点数 </span>
*/
public
synchronized
int
roll()
{
try
{
Random ran
=
new
Random(System.currentTimeMillis());
int
rollValue
=
ran.nextInt();
rollValue
%=
6
;
Thread.sleep(
6
);
return
rollValue
>
0
?
++
rollValue :
--
rollValue
*
-
1
;
}
catch
(Exception e)
{e.printStackTrace();}
return
1
;
}
}
客户端测试类:Mahjong.java
package
pattern.multion;
/**
* -----------------------------------------
* @描述 客户端测试类
* @作者 fancy
* @邮箱 fancydeepin@yeah.net
* @日期 2012-7-31 <p>
* -----------------------------------------
*/
public
class
Mahjong
{
private
static
Dice dice1
=
Dice.getInstance(Dice.INSTANCE1),
dice2
=
Dice.getInstance(Dice.INSTANCE2);
public
static
void
main(String[] args)
{
int
value1
=
dice1.roll();
int
value2
=
dice2.roll();
System.out.println(value1);
System.out.println(value2);
}
}
posted on 2012-07-31 17:44
fancydeepin
阅读(4020)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
github
个人主页
beanutil
jutil
jexcel
orc
随笔分类
(8)
junit
maven(8)
随笔档案
(104)
2015年6月 (8)
2015年2月 (1)
2015年1月 (1)
2014年9月 (1)
2014年8月 (3)
2014年6月 (10)
2014年5月 (3)
2014年3月 (5)
2013年10月 (1)
2013年9月 (2)
2013年4月 (1)
2013年3月 (2)
2013年2月 (11)
2012年11月 (3)
2012年10月 (14)
2012年8月 (15)
2012年7月 (13)
2012年6月 (10)
最新随笔
1. maven 为测试环境、生产环境等不同环境打包
2. maven 多模块项目
3. nexus 搭建 maven 私服
4. maven 镜像
5. maven jetty 插件使用
6. maven jdk 版本配置
7. eclipse maven plugin 插件 安装 和 配置
8. maven 安装
9. ORCP : 从数据库表到 java 对象生成的 eclipse 插件
10. jexcel 读写EXCEL
11. linux 系列
12. spring mvc(2):请求地址映射(@RequestMapping)
13. spring mvc(1):基础入门
14. Java 验证码、二维码
15. GXT —— TreePanel 组件(一)
搜索
积分与排名
积分 - 1460478
排名 - 15
最新评论
1. re: Maven 手动添加 JAR 包到本地仓库[未登录]
刚安装好的maven,仓库里没有jar包,如何添加jar包呢?
--Firefly
2. re: java 建造者模式(Builder)
多谢,讲的很清楚
--Nimo
3. re: Maven 手动添加 JAR 包到本地仓库
很好很强大, 完美的解决了我的问题。。。
--klose
4. re: eclipse maven plugin 插件 安装 和 配置
@fancydeepin
链接还是失效了啊
--菜鸟一号
5. re: Maven 手动添加 JAR 包到本地仓库[未登录]
@呼吸~
你好,请问,怎么设置代理呢?
--paul
阅读排行榜
1. eclipse maven plugin 插件 安装 和 配置(325749)
2. Maven 手动添加 JAR 包到本地仓库(199653)
3. Lombok 安装、入门 - 消除冗长的 java 代码(154826)
4. java 异常捕捉 ( try catch finally ) 你真的掌握了吗?(70161)
5. maven jetty 插件使用(49049)
6. JSP/Servlet 工作原理(43104)
7. maven jdk 版本配置(40974)
8. spring mvc(2):请求地址映射(@RequestMapping)(39550)
9. 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ](31232)
10. maven 多模块项目(27864)