一、概述
在軟件系統中,經常面臨着“某個對象”的創建工作,由於需求的變化,這個對象的具體實現經常面臨着劇烈的變化,但是它卻擁有比較穩定的接口。如何應對這種變化?如何提供一種封裝機制來隔離出“這個易變對象”的變化,從而保持系統中“其它依賴該對象的對象”不隨着需求的改變而改變?這就可以用到工廠方法模式了。
二、工廠方法模式
工廠方法模式定義了一個用於創建對象的接口,讓其子類決定實例化哪一個對象。使一個對象的創建工作延遲到其子類。
工廠方法模式的結構圖如下:
Product定義了工廠方法所創建的對象的接口。
ConcreteProduct實現Product接口, 定義了具體對象。
Creator定義了具體對象創建的工廠方法,該方法返回一個Product類型的對象。Creator也可以定義一個工廠方法的缺省實現,它返回一個缺省的ConcreteProduct對象
ConcreteCreator實現Creator接口,重定義工廠方法以返回一個ConcreteProduct實例。
三、示例
我們以實現一個文檔處理系統來看一下工廠方法模式的應用。
首先定義文檔類型的接口和兩個具體的文檔類型
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 : IFile
18 {
19 public void New()
20 {
21 Console.WriteLine("New Txt Create");
22 }
23 public void Save()
24 {
25 Console.WriteLine("Save Txt");
26 }
27 }
接着實現對象創建的工廠方法及具體文檔的創建工廠
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 : IFileFactory
13 {
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 }