(原創)無廢話C 設計模式之五 Prototype

2021-08-22 11:21:36 字數 4076 閱讀 4900

無廢話c#設計模式之五:prototype

意圖

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

場景

遊戲場景中的有很多相似的敵人,它們的技能都一樣,但是隨著敵人出現的位置不同,這些人的能力不太一樣。假設,我們現在需要把三個步兵組成一隊,其中還有乙個精英步兵,能力特別高。那麼,你或許可以建立乙個敵人抽象類,然後對於不同能力的步兵建立不同的子類。然後,使用工廠方法等設計模式讓呼叫方依賴敵人抽象類。

問題來了,如果有無數種能力不同步兵,難道需要建立無數子類嗎?還有,步兵模型的初始化工作是非常耗時的,建立這麼多步兵物件可能還會浪費很多時間。我們是不是可以通過只建立乙個步兵原型,然後複製出多個一摸一樣的步兵呢?複製後,只需要調整一下這些物件在地圖上出現的位置,或者調整一下它們的能力即可。原型模式就是用來解決這個問題的。

示例**

usingsystem;

usingsystem.threading;

usingsystem.collections.generic;

usingsystem.io;

usingsystem.runtime.serialization.formatters.binary;

usingsystem.diagnostics;

namespaceprototypeexample

console

.writeline(sw.elapsedmilliseconds);

}

}

classgamescene

}

[serializable]

classlocation

}

[serializable]

abstractclassenemy

set

}

protectedintpower;

publicintpower

set

}

protectedintspeed;

publicintspeed

set

}

publicabstractenemyclone(boolisdeepcopy);

publicabstractvoidshowinfo();

publicenemy(intpower,intspeed,locationlocation)

}

[serializable]

classfootman:enemy

publicoverridevoidshowinfo()

power: speed: location:(,)", model, power, speed, location.x, location.y);

}

publicoverrideenemyclone(boolisdeepcopy)

else

footman = (footman)this

.memberwiseclone();

returnfootman;

}

publicvoidfootmanattack()

}

}

**執行結果如下圖:

**說明

lenemy類是抽象原型,它有兩個用途,一是定義了原型的一些抽象內容,二是定義了原型模式必須的拷貝方法。在這裡,我們看到,每個敵人的屬性有位置、攻擊力、速度等,並且能通過showinfo()方法來獲取這個人的資訊。

lfootman類就是具體原型了,它顯示了敵人的具體引數以及實現了轉殖自身。

lgamescene類就是呼叫方,在這裡我們並沒有看到有和具體原因進行依賴,通過複製傳入的轉殖原型,得到一些新的敵人,在原型的基礎上稍微調整一下就變成了一支敵人部隊。

l原型模式通過對原型進行轉殖來替代無數子類,因此也就減少了呼叫方和具體型別產生依賴的程式。

lclone()方法接受乙個引數,表示是否是深拷貝。在這裡,我們通過序列化反序列化實現深拷貝,深拷貝實現物件的完整複製,包括物件

(原創)無廢話C 設計模式之八 Facade

無廢話c 設計模式之八 facade 意圖 為子系統中的一組介面提供乙個一致的介面,facade模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。場景 在乙個為遊戲充值的 中,建立訂單需要與三個外部介面打交道 l使用者系統 根據使用者名稱獲取使用者id 檢視使用者是否已經啟用了遊戲 l卡系...

(原創)無廢話C 設計模式之八 Facade

無廢話c 設計模式之八 facade 意圖 為子系統中的一組介面提供乙個一致的介面,facade模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。場景 在乙個為遊戲充值的 中,建立訂單需要與三個外部介面打交道 l使用者系統 根據使用者名稱獲取使用者id 檢視使用者是否已經啟用了遊戲 l卡系...

(原創)無廢話C 設計模式之九 Proxy

無廢話c 設計模式之九 proxy 意圖 為其他物件提供一種 以控制對這個物件的訪問。場景 模式非常常用,大致的思想就是通過為物件加乙個 來降低物件的使用複雜度 或是提公升物件使用的友好度 或是提高物件使用的效率。在現實生活中也有很多 的角色,比如明星的經紀人,他就是一種 經紀人為明星處理很多對外的...