场景
- 内存属于稀缺资源,不要随便浪费。如果有多个完全相同或者相似的对象,我们可以通过享元模式,节省内存。
核心:
享元模式一共享的方式高效地支持大量细粒度对象的重用。
享元模式对象能 做到共享的关键是区分内部状态和外部状态。
内部状态:可以共享,不会随环境变化而变化。
外部状态:不可以共享,会随着环境变化而改变。
享元模式的实现
FlyweightFactory享元工厂类
- 创建并管理对象,享元池一般设计成键值对
FlyWeight抽象享元类
- 通常是一个类接口或抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,并设置内部状态。
ConcreteFlyWeight具体享元类
- 为内部状态提供成员变量进行存储
UnsharedConcreteFlyWeight非共享享元类
- 不能被共享的子类可以设计为非共享子类
五子棋,我们都知道有黑白两种颜色,形状大小一样,但是位置是不能一样的,所以我们可以这样做
- 首先是非共享类
public class Coordinate {
private int x,y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
抽象享元类
public interface ChessFlyWeight {
String getColor();
void setColor(String color);
void display(Coordinate c);
}
抽象享元类
public class ConcreteChess implements ChessFlyWeight{
String color;
public ConcreteChess(String color) {
this.color = color;
}
@Override
public String getColor() {
return color;
}
@Override
public void setColor(String color) {
this.color=color;
}
@Override
public void display(Coordinate c) {
System.out.println("棋子颜色:"+color);
System.out.println("棋子位置:"+c.getX()+"----"+c.getY());
}
}
享元工厂类(获取棋子)
public class ChessFlyWeightFactory {
private static Map<String, ChessFlyWeight> map = new HashMap<>();
public static ChessFlyWeight getChess(String color) {
if (map.get(color) != null) {
return map.get(color);
} else {
ChessFlyWeight chessFlyWeight = new ConcreteChess(color);
return chessFlyWeight;
}
}
}
测试
ChessFlyWeight chess = ChessFlyWeightFactory.getChess("黑色");
ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess("黑色");
chess.display(new Coordinate(10, 10));
chess1.display(new Coordinate(20, 20));