前言(一些廢話,可以忽略)
- 享元模式,對象的共享設計思想,及採用容器將可能需要的對象封裝起來
- 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);
}
}
總結
- 享元模式就是大家平常經常接觸到的池技術,線程池呀,連接池呀,都是採用的這個思想
- 當然也運用到了單例模式,因爲我想要的是相同顏色的棋子只有一個
願你不捨愛與自由。