設計模式 | 享元模式(Flyweight)
阿新 • • 發佈:2020-11-14
定義:
運用共享技術有效地支援大量細粒度的物件。結構:(書中圖,侵刪)
一個享元工廠類 一個抽象享元類 若干需要共享的享元子類 若干不需要共享的享元子類 這裡要說兩個概念: 內部狀態:共享類內部的叫內部狀態 外部狀態:不在共享類內部的叫外部狀態例項:
享元模式的意義就是使相同或相似的物件共享同一個物件,從而起到節省資源的作用。 書中用到的例子是幫人做網站,很多客戶的需求其實是差不多的,但是為每個客戶都新建虛擬機器,複製一套一套程式碼,是很浪費資源的事情。 而且一旦有Bug或者需求要修改,工作量也是巨大的,完全可以共享物件。 我想起了自己上大學那會也幫人做過網站,後來人家又介紹了生意過來,我因為上班比較忙就拒絕了,要是早點把設計模式學好,說不定都財富自由了(狗頭) 下面的例項用書中提到的另外一個圍棋的例子吧。 圍棋的棋子都是一樣的,只是顏色和位置不同。 抽象棋子介面:packagedesignpattern.flyweight; public interface Chessman { abstract void position(String position); }
具體棋子類:
package designpattern.flyweight; public class ConcreteChessman implements Chessman { String color; public ConcreteChessman(String color) { this.color = color; } @Overridepublic void position(String position) { System.out.println(color + "棋下在:" + position); } }
棋子工廠類:
package designpattern.flyweight; import java.util.HashMap; import java.util.Map; public class ChessmanFactory { Map<String, Chessman> map = new HashMap<>(); publicChessman getChessman(String color) { if (map.containsKey(color)) { return map.get(color); } else { Chessman chessman = new ConcreteChessman(color); map.put(color, chessman); return chessman; } } }
客戶端:
package designpattern.flyweight; public class Client { public static void main(String[] args) { ChessmanFactory factory=new ChessmanFactory(); Chessman cc1= factory.getChessman("黑"); cc1.position("右上星位"); Chessman cc2= factory.getChessman("白"); cc2.position("天元"); Chessman cc3= factory.getChessman("黑"); cc3.position("右上目外"); } }
結果輸出:
黑棋下在:右上星位
白棋下在:天元
黑棋下在:右上目外
總結:
不知道該總結些什麼了,直接上書中的內容吧:上面的後半句我沒太看明白,所以留給大家自己理解吧。