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