一、概述
在軟體系統中,經常面臨著“某個對象”的建立工作,由於需求的變化,這個對象的具體實現經常面臨著劇烈的變化,但是它卻擁有比較穩定的介面。如何應對這種變化?如何提供一種封裝機制來隔離出“這個易變對象”的變化,從而保持系統中“其它依賴該對象的對象”不隨著需求的改變而改變?這就可以用到Factory 方法模式了。
二、Factory 方法模式
Factory 方法模式定義了一個用於建立對象的介面,讓其子類決定執行個體化哪一個對象。使一個對象的建立工作延遲到其子類。
Factory 方法模式的結構圖如下:
Product定義了Factory 方法所建立的對象的介面。
ConcreteProduct實現Product介面, 定義了具體對象。
Creator定義了具體對象建立的Factory 方法,該方法返回一個Product類型的對象。Creator也可以定義一個Factory 方法的預設實現,它返回一個預設的ConcreteProduct對象
ConcreteCreator實現Creator介面,重定義Factory 方法以返回一個ConcreteProduct執行個體。
三、樣本
我們以實現一個文檔處理系統來看一下Factory 方法模式的應用。
首先定義文件類型的介面和兩個具體的文件類型
1 public interface IFile 2 { 3 void New(); 4 void Save(); 5 } 6 public class DocFile : IFile 7 { 8 public void New() 9 {10 Console.WriteLine("New Doc Create");11 }12 public void Save()13 {14 Console.WriteLine("Save Doc");15 }16 }17 public class TxtFile : IFile18 {19 public void New()20 {21 Console.WriteLine("New Txt Create");22 }23 public void Save()24 {25 Console.WriteLine("Save Txt");26 }27 }複製代碼
接著實現對象建立的Factory 方法及具體文檔的建立工廠
1 interface IFileFactory 2 { 3 IFile Create(); 4 } 5 public class DocFileFactory : IFileFactory 6 { 7 public IFile Create() 8 { 9 return new DocFile();10 }11 }12 public class TxtFileFactory : IFileFactory13 {14 public IFile Create()15 {16 return new TxtFile();17 }18 }複製代碼
最後看一下如何調用
1 static void Main(string[] args) 2 { 3 IFile docFile = (new DocFileFactory()).Create(); 4 docFile.New(); 5 docFile.Save(); 6 IFile txtFile = (new TxtFileFactory()).Create(); 7 txtFile.New(); 8 txtFile.Save(); 9 Console.ReadLine();10 }