享元模式

124 阅读1分钟

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。

image.png

image.png

import java.util.HashSet;
import java.util.Set;

class FlyWeightPattern {
    public static void main(String[] args) {
        BikeFlyWeight bike1 = BikeFlyWeightFactory.getInstance().getBike();
        bike1.ride("ZhangSan");
//        bike1.back();

        BikeFlyWeight bike2 = BikeFlyWeightFactory.getInstance().getBike();
        bike2.ride("ZhaoSi");
        bike2.back();

        BikeFlyWeight bike3 = BikeFlyWeightFactory.getInstance().getBike();
        bike3.ride("WangWu");
        bike3.back();

        System.out.println(bike1 == bike2);
        System.out.println(bike2 == bike3);
    }
}

abstract class BikeFlyWeight {
    // 内部状态
    protected Integer state = 0; // 0是未使用,1是使用中

    // userName外部状态
    abstract void ride(String userName);
    abstract void back();

    public Integer getState() {
        return state;
    }
}

class MoBikeFlyWeight extends BikeFlyWeight {
    // 定义新的内部状态,车架号
    private String bikeId;
    public MoBikeFlyWeight(String bikeId) {
        this.bikeId = bikeId;
    }

    @Override
    void ride(String userName) {
        state = 1;
        System.out.println(userName + "骑" + bikeId + "自行车出行!");
    }

    @Override
    void back() {
        state = 0;
    }
}

class BikeFlyWeightFactory {
    private static BikeFlyWeightFactory instance = new BikeFlyWeightFactory();
    private Set<BikeFlyWeight> pool = new HashSet<>();

    public static BikeFlyWeightFactory getInstance() {
        return instance;
    }

    private BikeFlyWeightFactory() {
        for (int i = 0; i < 2; i++) {
            pool.add(new MoBikeFlyWeight(i + "号"));
        }
    }

    public BikeFlyWeight getBike() {
        for (BikeFlyWeight bike : pool) {
            if (bike.getState() == 0) {
                return bike;
            }
        }
        return null;
    }
}