1. 程式人生 > 實用技巧 >設計模式 | 享元模式(Flyweight)

設計模式 | 享元模式(Flyweight)

定義:

運用共享技術有效地支援大量細粒度的物件。

結構:(書中圖,侵刪)

一個享元工廠類 一個抽象享元類 若干需要共享的享元子類 若干不需要共享的享元子類 這裡要說兩個概念: 內部狀態:共享類內部的叫內部狀態 外部狀態:不在共享類內部的叫外部狀態

例項:

享元模式的意義就是使相同或相似的物件共享同一個物件,從而起到節省資源的作用。 書中用到的例子是幫人做網站,很多客戶的需求其實是差不多的,但是為每個客戶都新建虛擬機器,複製一套一套程式碼,是很浪費資源的事情。 而且一旦有Bug或者需求要修改,工作量也是巨大的,完全可以共享物件。 我想起了自己上大學那會也幫人做過網站,後來人家又介紹了生意過來,我因為上班比較忙就拒絕了,要是早點把設計模式學好,說不定都財富自由了(狗頭) 下面的例項用書中提到的另外一個圍棋的例子吧。 圍棋的棋子都是一樣的,只是顏色和位置不同。 抽象棋子介面:
package
designpattern.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;
    }

    @Override
    
public 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<>();

    public
Chessman 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("右上目外");
    }
}

結果輸出:

黑棋下在:右上星位
白棋下在:天元
黑棋下在:右上目外

總結:

不知道該總結些什麼了,直接上書中的內容吧:

上面的後半句我沒太看明白,所以留給大家自己理解吧。