享元模式

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

3.类图

享元模式_第1张图片

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是设计模式中少见的出于性能目的考虑的模式。

你可能感兴趣的:(设计模式,享元模式)