2.3 Factory Method(工厂方法)
【返回目錄】
我們現在把場景從險象叢生的特工戰切換到更為壯觀的二戰中來,很多人都看過《拯救大兵瑞恩》,這部電影最著名的兩場戰斗非首和尾莫屬,我們就用最后一場戰役來舉例說明什么是工廠方法吧。
相比諾曼底登陸,最后一場戰役出現了更多的武器,天上飛的、地上爬的都有,那么Tom Hanks還能一把M1A1就走遍天下嗎,顯然不可能,M1A1對付步兵很不錯,但要想搞定一輛坦克就很困難了,用它來對付戰斗機,純屬扯淡。所以在最后一場戰役中出現的武器也是多元化的,負責瞭望的狙擊手用的是M1903A4狙擊步槍、像Tom Hanks這樣的軍官用的是湯姆森M1A1沖鋒槍、普通士兵用的是伽蘭德步槍、對付坦克用到了TNT***、收拾坦克中的殘兵用的是手榴彈……總之,武器只有用在合適的目標上在能發揮最大的威力。那么怎么才能知道我到底該用那種武器呢?Tom Hanks絕不可能戰斗前先跟每個士兵交代清楚他應該用什么樣的武器,因為根本沒人知道他們到底會面對什么樣的敵人,所以按套路出牌是行不通的,就只能具體問題具體分析了。
同樣的,我們在編寫程序時可能也常常會碰到類似的問題,我并不知道當前會碰到什么樣的需求,所以我不能確定到底應該返回給調用者一個什么對象,在這種情況下,就不得不把決定權下放給負責生成對象的子類了。這也正是Factory Method(工廠方法)模式所適用的場景,我們來看看下面的代碼就一目了然了:
1: using System; 2:? 3: namespace Autumoon.DesignPatterns.FactoryMethod 4: { 5: public abstract class WeaponBase 6: { 7: public string Name { get; set; } 8:? 9: public abstract void Use(object target); 10: } 11:? 12: public class Gun : WeaponBase 13: { 14: public bool IsAuto { get; set; } 15:? 16: public override void Use(object target) 17: { 18: // TODO: Use this weapon to kill target. 19: } 20: } 21:? 22: public class Bomb : WeaponBase 23: { 24: public int Power { get; set; } 25:? 26: public override void Use(object target) 27: { 28: // TODO: Use this weapon to kill target. 29: } 30: } 31:? 32: public abstract class AbstractBattle 33: { 34: public abstract WeaponBase CreateWeaponByTargetType(string targetType); 35: } 36:? 37: public class Battle : AbstractBattle 38: { 39: public override WeaponBase CreateWeaponByTargetType(string targetType) 40: { 41: switch (targetType) 42: { 43: case "Soldier": 44: return new Gun { Name = "M1A1", IsAuto = true }; 45: case "Tank": 46: return new Bomb { Name = "TNT", Power = 1000 }; 47: default: 48: return null; 49: } 50: } 51: } 52: }這個時候,Tom Hanks和他的戰友們聽到了遠處的坦克聲,是戰斗的時候了,拿起武器,沖向勝利!
1: Battle bridgeBattle = new Battle(); 2: Gun m1a1 = bridgeBattle.CreateWeaponByTargetType("Soldier") as Gun; 3: Bomb tnt = bridgeBattle.CreateWeaponByTargetType("Tank") as Bomb;轉載于:https://www.cnblogs.com/Autumoon/archive/2007/12/05/984044.html
總結
以上是生活随笔為你收集整理的2.3 Factory Method(工厂方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 语义分割-ICCV2017 Unpair
- 下一篇: 京东聚合收银(会员码支付)接口封装C++