享元模式

1.定义
运用共享技术有效的支持大量细粒度的对象。
2.适用场景
1)应用使用了大量的对象,并且造成了大量的存储开销。例如编辑一个文档,会有大量重复的字符,如果每个都创建一个新的对象,会造成很大的内存开销。

3.类图

[img]http://dl2.iteye.com/upload/attachment/0105/5805/61459298-f9d5-3464-9aaa-7f50a3de64ed.jpg[/img]

1)Character:Flyweight接口。
2)CharacterA、CharacterB:Flyweight接口的具体实现,这些对象是可以被共享的。
3)CharacterFactory:工厂类,通过它来实现对Flyweight对象的管理和创建,如果对象已经存在就直接返回,如果不存在就创建并保存,以便下次直接返回。
4)FlyweightMain:客户端。示例中没有外部状态,如果有外部状态的话由客户端负责维护,例如字符的位置和颜色可以作为外部状态。


4.代码示例
public abstract class Character {
protected char c;
protected void display(){
System.out.println(this.c);
}
}
public class CharacterA extends Character {
public CharacterA(){
this.c = 'A';
}
}
public class CharacterB extends Character {
public CharacterB(){
this.c = 'B';
}
}
public class CharacterFactory {
private static Map<String,Character> map = new HashMap<String,Character>();
public synchronized static Character getCharacter(String key){
Character character = map.get(key);
if(character == null){
if(key.equals("A")){
character = new CharacterA();
map.put(key,character);
}
else if(key.equals("B")){
character = new CharacterB();
map.put(key,character);
}
}
return character;
}
}
public class FlyweightMain {
public static void main(String[] args) throws Exception{
Character A1 = CharacterFactory.getCharacter("A");
Character A2 = CharacterFactory.getCharacter("A");
System.out.println(A1 == A2);
}
}
输出结果:
true
可见两次获取的是同一个对象

5.其他
1)Flyweight是设计模式中少见的出于性能目的考虑的模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值