1.定义
运用共享技术有效的支持大量细粒度的对象。
2.适用场景
1)应用使用了大量的对象,并且造成了大量的存储开销。例如编辑一个文档,会有大量重复的字符,如果每个都创建一个新的对象,会造成很大的内存开销。
3.类图
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是设计模式中少见的出于性能目的考虑的模式。