您的位置:首页 > 其它

23种设计模式之享元模式(FlyWeight)

2018-01-26 11:00 549 查看

场景

内存属于稀缺资源,不要随便浪费。如果有多个完全相同或者相似的对象,我们可以通过享元模式,节省内存。

核心:

享元模式一共享的方式高效地支持大量细粒度对象的重用。

享元模式对象能 做到共享的关键是区分内部状态和外部状态。

内部状态:可以共享,不会随环境变化而变化。

外部状态:不可以共享,会随着环境变化而改变。

享元模式的实现

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
4000
();

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));




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: