【結構型模式】享元模式

前言(一些廢話,可以忽略)

  • 享元模式,對象的共享設計思想,及採用容器將可能需要的對象封裝起來
  • 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);
    }
}

總結

  • 享元模式就是大家平常經常接觸到的池技術,線程池呀,連接池呀,都是採用的這個思想
  • 當然也運用到了單例模式,因爲我想要的是相同顏色的棋子只有一個

願你不捨愛與自由。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章