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