前言(一些废话,可以忽略)
- 享元模式,对象的共享设计思想,及采用容器将可能需要的对象封装起来
- PS.部分类实现见文末
解决实际问题
- 棋牌类游戏,五子棋,围棋等,棋子其实就两种,黑和白,但是他们的位置变化多端,这个是否如果没有位置上的棋子都创建一个对象的话,就很浪费空间,这个时候,如果就创建黑白两个对象,让后位置不停的变化,岂不是很节约空间
- 这就是享元模式的设计思想,共享对象
享元模式
- 抽象的棋子,可以设置其位置,可落子
/**
* 棋子
* @program: ade-someproblem
* @author: cade franklin
* @create: 2020-01-06 06:08
**/
public interface Chess {
/**
* 落子
*/
void down();
void setPosition(Position position);
}
- 具体的棋子,这里为五子棋,可以设置颜色,默认位置为0,0,可以为其设置新的位置
/**
* 五子棋棋子
* @program: ade-someproblem
* @author: cade franklin
* @create: 2020-01-05 05:20
**/
public class FiveChess implements Chess{
private String color;
private Position position = new Position(0, 0);
public FiveChess(String color) {
this.color = color;
}
@Override
public void down() {
System.out.println("FiveChess.down:"+position.toString());
}
@Override
public void setPosition(Position position) {
this.position = position;
}
}
- 需要一个工厂对象来存放获取棋子,相当于棋子池
/**
* @program: ade-someproblem
* @author: cade franklin
* @create: 2020-01-05 05:21
**/
public class FlyWeightFactory {
private static final Map<String, Chess> chessList = new HashMap<String, Chess>();
public static String BLACK = "BLACK";
public static String WHITE = "WHITE";
Chess getMyChess(String color){
if(BLACK.equals(color) && WHITE.equals(color)){
throw new RuntimeException("只有BLACK和WHITE");
}
//感觉这个地方是个单例,如果多线程的使用的话,得上锁
Chess chess = chessList.get(color);
if(chess == null){
chess = new FiveChess(color);
chessList.put(color, chess);
}
return chess;
}
}
- 使用案例,通过工厂对象创建棋子,如果存在棋子,则获得,如果没有将创建
/**
* @program: ade-someproblem
* @author: cade franklin
* @create: 2020-01-05 05:21
**/
public class FlyWeightMode {
public static void main(String[] args) {
FlyWeightFactory flyWeightFactory = new FlyWeightFactory();
Chess fiveChess = flyWeightFactory.getMyChess(FlyWeightFactory.BLACK);
Position position = new Position(1,2);
fiveChess.setPosition(position);
fiveChess.down();
Chess fiveChess02 = flyWeightFactory.getMyChess(FlyWeightFactory.BLACK);
Position position02 = new Position(2,32);
fiveChess02.setPosition(position02);
fiveChess02.down();
//这里两个对象是相等的,因为他们都是相同的颜色
System.out.println(fiveChess==fiveChess02);
}
}
总结
- 享元模式就是大家平常经常接触到的池技术,线程池呀,连接池呀,都是采用的这个思想
- 当然也运用到了单例模式,因为我想要的是相同颜色的棋子只有一个
愿你不舍爱与自由。