Java设计模式_结构型_享元模式_实现单元的共享

转载请注明出处:http://blog.csdn.net/ljmingcom304/article/details/50461987
本文出自:【梁敬明的博客】

1.抽象享元角色

  享元模式区分内蕴状态和外蕴状态,其中内蕴状态是共性,外蕴状态是特性。抽象享元角色规定了享元角色必须实现的方法,在此方法中外蕴状态以参数的形式传入。

public interface Flyweight {
    void operation(String eState);
}

2.具体享元角色

  实现抽象享元角色的方法,如果存在内蕴状态,并负责为内蕴状态提供存储空间。

public class ConcreteFlyweight implements Flyweight {

    private String iState = null;

    public ConcreteFlyweight(String iState) {
        this.iState = iState;
    }

    @Override
    public void operation(String eState) {
        System.out.println("内蕴状态:" + this.iState);
        System.out.println("外蕴状态:" + eState);
    }

}

3.复合享元角色

  所包含的对象是不可共享的,并可以分解成多个单纯享元对象的组合。

public class ConcreteCompositeFlyweight implements Flyweight{

    private Map map = new HashMap();

    public void add(String key,Flyweight flyweight){
        map.put(key, flyweight);
    }

    @Override
    public void operation(String eState) {
        Flyweight flyweight = null;
        for (String key : map.keySet()) {
            flyweight = map.get(key);
            flyweight.operation(eState);
        }
    }

}

4.享元工厂角色

  负责创建和管理享元角色,达到对象共享的目的。

public class FlyweightFactory {

    private Map map = new HashMap();

    //复合享元
    public Flyweight create(List iStates){
        ConcreteCompositeFlyweight ccf = new ConcreteCompositeFlyweight();
        for (String iState : iStates) {
            ccf.add(iState, this.create(iState));
        }
        return ccf;
    }

    //单纯享元
    public Flyweight create(String iState){
        Flyweight flyweight = map.get(iState);
        if(flyweight==null){
            flyweight = new ConcreteFlyweight(iState);
            map.put(iState, flyweight);
        }
        return flyweight;
    }
}

5.客户端角色

  通过享元工厂角色来创建和管理享元角色,并设置享元角色的内蕴状态与外蕴状态。

public class Client {

    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        // 具体享元角色
        Flyweight weight1 = factory.create("A");
        weight1.operation("A1");
        Flyweight weight2 = factory.create("B");
        weight2.operation("B1");
        Flyweight weight3 = factory.create("A");
        weight3.operation("A2");

        // 复合享元角色
        ArrayList list = new ArrayList();
        list.add("baidu");
        list.add("google");
        Flyweight weight4 = factory.create(list);
        weight4.operation("network");
    }

}

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