工廠方法(FactoryMethod)模式:是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。也就是說核心工廠類不再負責產品的創建,僅負責具體工廠子類必須實現的接口就行。這樣抽象的好處是顯而易見的,我們不再需要去修改具體工廠的角色了。 例如下面的代碼:是一個即將畢業的大學生,以學雷鋒做好事的名義去幫助一位老人: [csharp] //雷鋒類 class LeiFeng { public void Sweep() { Console.WriteLine("掃地"); } public void Wash() { Console.WriteLine("洗衣"); } public void BuyRice() { Console.WriteLine("買米"); } } //“學雷鋒的大學生”類,繼承雷鋒 class UnderGraduate : LeiFeng { } //客戶端代碼 static void Main(string[] args) { LeiFeng xueleifeng = new UnderGraduate(); xueleifeng.Wash(); xueleifeng.Sweep(); xueleifeng.BuyRice(); } 現在如果添加人數,例如共3位同學做這些事,那麼只需要實例化三個“學雷鋒的大學生”對象了: [csharp] //客戶端代碼 static void Main(string[] args) { LeiFeng student1 = newUnderGraduate(); student1.Wash(); LeiFeng student2 = newUnderGraduate(); student2.Sweep(); LeiFeng studen3 = newUnderGraduate(); studen3.BuyRice(); } 這時候就有人有異議了,難道只能大學生去學雷鋒做好事嗎?我們中學生也可以盡一己之力的。於是,這時候就不是單單實例化多個對象的問題了。 於是雷鋒工廠就來了。 [csharp] //雷鋒工廠 interface Ifactory { LeiFeng CreateLeiFeng(); } //“學雷鋒的大學生”工廠 class UnderGraduateFactory : Ifactory { public LeiFeng CreateLeiFeng() { return new UnderGraduate() ; } } //“學雷鋒的中學生”工廠 class MiddleStudentFactory : Ifactory { public LeiFeng CreateLeiFeng() { return new MiddleStudent(); } } 客戶端調用的時候只需要這樣就可以了: [csharp] //客戶端代碼 static void Main(string[] args) { //工廠方法模式 Ifactory factory = newUnderGraduateFactory(); //要換成“中學生”,修改這裡就行 LeiFeng student =factory.CreateLeiFeng(); student.BuyRice(); student.Wash(); student.Sweep(); } 這時候怎麼樣,想換成中學生還不容易嗎? 通過以上的代碼,我們可以看到,工廠方法克服了簡單工廠違背“開放-封閉原則”的缺點,又保持了封裝對象創建過程的優點,降低了客戶程序與產品對象的耦合。可以說工廠方法模式是簡單工廠模式的進一步抽象和推廣。 可是有一個問題,當我們每增加一個產品時,都需要加一個產品工廠的類,很顯然會增加額外的開發量,那該怎麼辦呢?這又要說到-“反射”了。不過此篇博客不會細講,在以後的抽象工廠模式中會有詳解。