1. 程式人生 > 遊戲攻略 >《原神攻略》1.6版本海島地圖開荒攻略

《原神攻略》1.6版本海島地圖開荒攻略

在享元模式中可以共享的相同內容稱為 內部狀態(Intrinsic State),而那些需要外部環境來設定的不能共享的內容稱為 外部狀態(Extrinsic State),

其中外部狀態和內部狀態是相互獨立的,外部狀態的變化不會引起內部狀態的變化。由於區分了內部狀態和外部狀態,因此可以通過設定不同的外部狀態使得相同的物件可以具有一些不同的特徵,而相同的內部狀態是可以共享的。

也就是說,享元模式的本質是分離與共享 : 分離變與不變,並且共享不變。把一個物件的狀態分成內部狀態和外部狀態,內部狀態即是不變的,外部狀態是變化的;然後通過共享不變的部分,達到減少物件數量並節約記憶體的目的。

享元模式是物件池的一種實現。類似於執行緒池,執行緒池可以避免不停的建立和銷燬多個物件,消耗效能。享元模式也是為了減少記憶體的使用,避免出現大量重複的建立銷燬物件的場景。

注意事項:1、注意劃分外部狀態和內部狀態,否則可能會引起執行緒安全問題。 2、這些類必須有一個工廠物件加以控制。

程式碼:

public interface FlyWeight {
    public void operate(String status);
}
public class FlyWeightImpl implements FlyWeight {
    //內部狀態不可改,通過構造方法傳入
    private String inner;
    public FlyWeightImpl(String inner) {
        this.inner = inner;
    }

    
//外部狀態可修改 @Override public void operate(String outer) { System.out.println("inner: " + inner + ", outer: " + outer); } }
// 類似執行緒池,有則從map中取出,沒有則建立一個物件放到map中
public class FlyWeightFactory {
    Map<String, FlyWeight> map = new HashMap<>();
    public FlyWeight factory(String inner) {
        FlyWeight fly 
= map.get(inner); if(fly == null) { fly = new FlyWeightImpl(inner); map.put(inner, fly); } return fly; } }

測試程式碼:

public class TestDemo {
    public static void main(String[] args) {
        FlyWeightFactory factory = new FlyWeightFactory();
        FlyWeight f1 = factory.factory("a");
        f1.operate("first");
        
        FlyWeight f2 = factory.factory("b");
        f2.operate("second");

        FlyWeight f3 = factory.factory("a");
        f3.operate("third");

        // f1 和 f3是同一個物件
        System.out.println(f1 == f3);
    }
}

結果:

這裡f3拿到的是f1的物件,且內部狀態相同,外部狀態不同。