享元模式示例代码

例子来源:《设计模式之禅》——第28章 享元模式
享元模式示例代码
Flyweight:抽象享元角色
ConcreteFlyweight:具体享元角色
unsharedConcreteFlyweight:不可共享的享元角色
FlyweightFactory:享元工厂

Flyweight

public abstract class Flyweight {
    private String intrinsic;
    // 外部状态
    protected final String Extrinsic;

    // 要求享元角色必须接受外部状态
    public Flyweight(String extrinsic) {
        Extrinsic = extrinsic;
    }

    // 定义业务操作
    public abstract void operate();

    // 内部状态的getter/setter
    public String getIntrinsic() {
        return intrinsic;
    }

    public void setIntrinsic(String intrinsic) {
        this.intrinsic = intrinsic;
    }
}

ConcreteFlyweightA

public class ConcreteFlyweightA extends Flyweight {
    // 接受外部状态
    public ConcreteFlyweightA(String extrinsic) {
        super(extrinsic);
    }

    // 根据外部状态进行逻辑处理
    @Override
    public void operate() {
        System.out.println("ConcreteFlyweightA");
    }
}

ConcreteFlyweightB

public class ConcreteFlyweightB extends Flyweight {
    // 接受外部状态
    public ConcreteFlyweightB(String extrinsic) {
        super(extrinsic);
    }

    // 根据外部状态进行逻辑处理
    @Override
    public void operate() {
        System.out.println("ConcreteFlyweightA");
    }
}

FlyweightFactory

public class FlyweightFactory {
    // 定义一个池容器
    private static HashMap<String, Flyweight> pool = new HashMap<String, Flyweight>();

    public static Flyweight getFlyweight(String Extrinsic) {
        // 需要返回的对象
        Flyweight flyweight = null;

        // 在池中没有该对象
        if (pool.containsKey(Extrinsic)) {
            flyweight = pool.get(Extrinsic);
        } else {
            // 根据外部状态创建享元对象
            flyweight = new ConcreteFlyweightA(Extrinsic);
            // 放置到池中
            pool.put(Extrinsic, flyweight);
        }
        return flyweight;
    }
}

Client

public class Client {
    public static void main(String[] args) {
        for (int i = 0; i < 4; i++) {
            String key = "test" + i;
            FlyweightFactory.getFlyweight(key);
        }
        Flyweight flyweight = FlyweightFactory.getFlyweight("test0");
        if(flyweight != null){
            flyweight.operate();
        }else{
            flyweight.operate();
        }
    }
}

享元模式是一个非常简单的模式,它可以大大减少应用程序创建的对象,降低程序内存的占用,增强程序的性能。