工厂方法 Factory Method
背景:有一個應用框架,它可以向用戶顯示多個文檔。在這個框架中,兩個主要的抽象是類Application和Document.這兩個類都是抽象的。客戶必須通過它們的子類來做與舉替應用相關的實現(xiàn)。
分析:因為被實例化的特定Document子類是與特定應用相關的,所iApplication類不可能預測到那個Document子類將被實例化一一Application類僅直到一個新的文檔何時應被創(chuàng)建,而不知道哪一種Document將被創(chuàng)建。這就產生了一個尷尬的局面框架必須實例化類,但是它只知道不能被實例化的抽象類。
延遲實例化一一工廠方法:
工廠方法模式定義了一個創(chuàng)建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。
需求:使用框架開發(fā)一款Word應用程序。
1 namespace FactoryMethod 2 { 3 /// <summary> 4 /// 文檔抽象類,定義了文檔的一般操作接口 5 /// </summary> 6 public abstract class Document 7 { 8 public abstract void Open(); 9 public abstract void Close(); 10 public abstract void Save(); 11 public abstract void Revert(); 12 } 13 14 } 1 namespace FactoryMethod 2 { 3 /// <summary> 4 /// 文檔生產工廠,定義了生產文檔的接口 5 /// </summary> 6 public abstract class Application 7 { 8 public abstract Document CreateDocument(); 9 10 } 11 } using System;namespace FactoryMethod {public class Word:Document{public override void Close(){Console.WriteLine("關閉了一個Word文檔");}public override void Open(){Console.WriteLine("打開了一個Word文檔");}public override void Revert(){Console.WriteLine("恢復了一個Word文檔");}public override void Save(){Console.WriteLine("保存了一個Word文檔");}} } 1 namespace FactoryMethod 2 { 3 public class WordApp : Application 4 { 5 public override Document CreateDocument() 6 { 7 return new Word(); 8 } 9 } 10 } 1 using System; 2 3 namespace FactoryMethod 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 Application app = new WordApp(); 10 Document doc = app.CreateDocument(); 11 doc.Open(); 12 doc.Revert(); 13 doc.Save(); 14 doc.Close(); 15 Console.ReadKey(); 16 } 17 } 18 }運行結果:
?
?新的需求:使用現(xiàn)有框架再開發(fā)一款Excel和PowerPoint應用程序。
分析:方法一:分別增加對應的工廠子類和產品子類即可。
方法二:參數化工廠,根據工廠接收的不同參數,返回不同的產品。(本人比較懶,這種方法要修改很現(xiàn)有多代碼,放棄)
方法三:使用泛型。
這里我就采用泛型了,泛型的好處是不言而喻的,一次編寫,永久使用,再多的產品使用這一個模板工廠就可以了。而且也不需要改變原有代碼。
1 namespace FactoryMethod 2 { 3 public class App<T> : Application where T : Document,new() 4 { 5 public override Document CreateDocument() 6 { 7 return new T(); 8 } 9 } 10 } 1 using System; 2 3 namespace FactoryMethod 4 { 5 class Excel:Document 6 { 7 public override void Close() 8 { 9 Console.WriteLine("關閉了一個Excel文檔"); 10 } 11 12 public override void Open() 13 { 14 Console.WriteLine("打開了一個Excel文檔"); 15 } 16 17 public override void Revert() 18 { 19 Console.WriteLine("恢復了一個Excel文檔"); 20 } 21 22 public override void Save() 23 { 24 Console.WriteLine("保存了一個Excel文檔"); 25 } 26 } 27 } 1 using System; 2 namespace FactoryMethod 3 { 4 public class PPT:Document 5 { 6 public override void Close() 7 { 8 Console.WriteLine("關閉了一個PPT文檔"); 9 } 10 11 public override void Open() 12 { 13 Console.WriteLine("打開了一個PPT文檔"); 14 } 15 16 public override void Revert() 17 { 18 Console.WriteLine("恢復了一個PPT文檔"); 19 } 20 21 public override void Save() 22 { 23 Console.WriteLine("保存了一個PPT文檔"); 24 } 25 } 26 }?運行結果:
?
參考資料《Design Patterns》
轉載于:https://www.cnblogs.com/blackteeth/p/10217509.html
總結
以上是生活随笔為你收集整理的工厂方法 Factory Method的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlserver——视图
- 下一篇: C# WebRequest.Create