[code]
Flyweight 是拳击比赛中的特用名词,意思是“特轻量级”,指的是51 公斤级比赛,用到设计模式中是指我们的类要轻量级,粒度要小这才是它要表到的意思,粒度小了,带来的问题就是对象太多,那就是用共享技术来解决。
场景:
在报考系统中,我们需要填写信息:
public class SignInfo {
//报名人员的ID
private String id;
//考试地点
private String location;
//考试科目
private String subject;
//邮寄地址
private String postAddress;
。。。。。。
}
上面是填写信息的 java Bean
但是问题来了: 如果一万个人注册,那么就会有一万个SignInfo同时在内存中产生,那么内存就爆了。。。所以我们不能让他产生这么多对象。。。。怎么办。。。
方法只有一个,就是排队请求呗,因为一万个人同时注册,而我又不能产生一万个SignInfo,那么当然在同一时刻不可能一万个人都在搞。。所以只能让部分的人等待
所以我们规定同一地区同一考试科目的SignInfo必须排队来取。。。。那么我们就让同一地区同一考试科目的SignInfo只能产生一个,而且他要处理一队人,放入线程池哈
public class SignInfo4Pool extends SignInfo {
//定义一个对象池提取的KEY值
private String key;
//构造函数获得相同标志
public SignInfo4Pool(String _key){
this.key = _key;
}
。。。。。。
}
public class SignInfoFactory {
//池容器
private static HashMap<String,SignInfo> pool = new
HashMap<String,SignInfo>();
//从池中获得对象
public static SignInfo getSignInfo(String key){
//设置返回对象
SignInfo result = null;
//池中没有该对象,则建立,并放入池中
if(!pool.containsKey(key)){
System.out.println(key + "----建立对象,并放置到池中");
result = new SignInfo4Pool(key);
pool.put(key, result);
}else{
result = pool.get(key);
System.out.println(key +"---直接从直池中取得");
}
return result;
}
那么我们拿对象是这么拿的。。。
SignInfo signInfo = SignInfoFactory.getSignInfo("科目1考试地点1");
注意:因为共享,所以带来性能问题。。。其实我可以这么解决
先拿出来这个sinInfo,然后在用他的时候直接用对象锁啊。。。
synchronized(signInfo.this){
....... //这样不就搞定了呀
}
[/code]
Flyweight 是拳击比赛中的特用名词,意思是“特轻量级”,指的是51 公斤级比赛,用到设计模式中是指我们的类要轻量级,粒度要小这才是它要表到的意思,粒度小了,带来的问题就是对象太多,那就是用共享技术来解决。
场景:
在报考系统中,我们需要填写信息:
public class SignInfo {
//报名人员的ID
private String id;
//考试地点
private String location;
//考试科目
private String subject;
//邮寄地址
private String postAddress;
。。。。。。
}
上面是填写信息的 java Bean
但是问题来了: 如果一万个人注册,那么就会有一万个SignInfo同时在内存中产生,那么内存就爆了。。。所以我们不能让他产生这么多对象。。。。怎么办。。。
方法只有一个,就是排队请求呗,因为一万个人同时注册,而我又不能产生一万个SignInfo,那么当然在同一时刻不可能一万个人都在搞。。所以只能让部分的人等待
所以我们规定同一地区同一考试科目的SignInfo必须排队来取。。。。那么我们就让同一地区同一考试科目的SignInfo只能产生一个,而且他要处理一队人,放入线程池哈
public class SignInfo4Pool extends SignInfo {
//定义一个对象池提取的KEY值
private String key;
//构造函数获得相同标志
public SignInfo4Pool(String _key){
this.key = _key;
}
。。。。。。
}
public class SignInfoFactory {
//池容器
private static HashMap<String,SignInfo> pool = new
HashMap<String,SignInfo>();
//从池中获得对象
public static SignInfo getSignInfo(String key){
//设置返回对象
SignInfo result = null;
//池中没有该对象,则建立,并放入池中
if(!pool.containsKey(key)){
System.out.println(key + "----建立对象,并放置到池中");
result = new SignInfo4Pool(key);
pool.put(key, result);
}else{
result = pool.get(key);
System.out.println(key +"---直接从直池中取得");
}
return result;
}
那么我们拿对象是这么拿的。。。
SignInfo signInfo = SignInfoFactory.getSignInfo("科目1考试地点1");
注意:因为共享,所以带来性能问题。。。其实我可以这么解决
先拿出来这个sinInfo,然后在用他的时候直接用对象锁啊。。。
synchronized(signInfo.this){
....... //这样不就搞定了呀
}
[/code]