1. 程式人生 > >設計模式之C#實現(一)--AbstractFactory

設計模式之C#實現(一)--AbstractFactory

Abstract Factory 讀書筆記

意圖:

為建立相關的或者相互依賴的物件配置一個藉口而不指定他們具體的類。

別名:

Kit

理解:

抽象工廠是一種建立型的模式,它為我們建立物件提供了有效地方法,我們不用直接new物件而是可以為建立物件配置一個介面,該介面定義瞭如何建立物件的方法。我們還知道抽象工廠建立的物件是一個系列的或者是一族的。該模式的最大特點就是將它的具體建立的任務交給了他的子類也就是具體的類,因此我們將建立物件的時間延遲到了它的子類。我們知道,在設計模式(GOF)的書裡說了設計模式是為有一定面向物件基礎的開發人員準備的。所以我們都應改知道類和型別之間的區別,在現在的程式語言裡介面是最為抽象的資料結構,因此我們將我們的抽象工廠裡的

AbstractFactoy定義成介面也是很自然的。一個這樣的工廠可以建立一族產品是什麼意思呢?也就是說這一類產品都有相同的父類或者父介面。在這裡我不想重複GOF裡面的話關於這些物件之間的協作和結果以及帶來的影響等等,這些在《Design Patterns Elements of Resable Object-Oriented Software》本書裡可以看到。下面我想用C#實現這個模式來供大家參考。

結構:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

通過我們的面向物件的知識我們知道一個父類可以標識一個子類的物件,這也是理解這裡的關鍵,我們在程式裡將會用一個抽象類的物件表示一個子類的物件。如上圖所示,我們現在有我們有一個IabstractFactoy的介面,該介面的職責就是實現建立物件的工作,我們再有兩個具體的工廠ConcreteFactory1ConcreteFactory2他們就是具體實現介面中的函式他們實現了這兩個方法,當然在具體的應用中可能沒有兩個具體的工廠,在GOF的書中說過在很多情況下我們並沒有工廠的抽象介面,大多數情況都是直接使用具體工廠來實現的,在這裡我想力圖完整的描述書中的結構所以實現也是一樣的。好了下面就是我的程式碼,這段程式碼顯示了我們是怎麼在

C#中實現AbstractFactory的。我用一個WinForm來測試結構。

實現程式碼:

using System;

namespace AbstractFactory_Me

{

publicinterface IAbstractFactory{

IAbstractProductA CreateProductA();

IAbstractProductB CreateProductB();

}

publicinterface IAbstractProductA{

string ShowSelf();

string ShowOther(IAbstractProductB b);

}

publicclass ProductA1 : IAbstractProductA{

public ProductA1(){}

publicstring ShowSelf(){

returnthis.ToString();

}

publicstring ShowOther(IAbstractProductB b){

return b.ToString();

}

}

publicclass ProductA2 : IAbstractProductA{

public ProductA2(){}

publicstring ShowSelf(){

returnthis.ToString();

}

publicstring ShowOther(IAbstractProductB b){

return b.ToString();

}

}

publicinterface IAbstractProductB{

string ShowSelf();

string ShowOther(IAbstractProductA a);

}

publicclass ProductB1 : IAbstractProductB{

publicstring ShowSelf(){

returnthis.ToString();

}

publicstring ShowOther(IAbstractProductA a){

return a.ToString();

}

}

publicclass ProductB2 : IAbstractProductB{

publicstring ShowSelf(){

returnthis.ToString();

}

publicstring ShowOther(IAbstractProductA a){

return a.ToString();

}

}

publicclass ConcreteFactory1 : IAbstractFactory{

public IAbstractProductA CreateProductA(){

returnnew ProductA1();

}

public IAbstractProductB CreateProductB(){

returnnew ProductB1();

}

}

publicclass ConcreteFactory2 : IAbstractFactory{

public IAbstractProductA CreateProductA(){

returnnew ProductA2();

}

public IAbstractProductB CreateProductB(){

returnnew ProductB2();

}

}

publicclass Client{

publicvoid run(){

IAbstractFactory factory1 = new ConcreteFactory1();

IAbstractProductA a = factory1.CreateProductA();

a.ShowSelf();

IAbstractProductB b = factory1.CreateProductB();

b.ShowSelf();

b.ShowOther(a);

}

}

}

我們在測試的WinForm裡面放了一個richTextBox1例項,他用來顯示結構。

privatevoid Form1_Load(object sender, System.EventArgs e) {

this.richTextBox1.Clear();

IAbstractFactory factory1 = new ConcreteFactory1();

IAbstractProductA a = factory1.CreateProductA();

IAbstractProductB b = factory1.CreateProductB();

this.richTextBox1.AppendText(a.ShowSelf()+"/n");

this.richTextBox1.AppendText(b.ShowSelf()+"/n");

this.richTextBox1.AppendText(b.ShowOther(a)+"/n");

this.richTextBox1.AppendText(a.ShowOther(b)+"/n/n/n");

this.richTextBox1.AppendText(a.GetType().ToString()+"/n");

this.richTextBox1.AppendText(b.GetType().ToString()+"/n");

}

為了清楚的說明問題我們在生成的物件中使用了ShowSelfShowOther的方法用來顯示自己和另外一個物件。

如要檢視書中該例子的C#實現請到這裡:

希望本文可以對即將要學習設計模式或者還有疑惑的人提供幫助,由於作者的能力有限如果文中又不對的地方請指出,或者聯絡我謝謝!