2014-03-25 93 views
1

我已經閱讀了很多關於抽象工廠和工廠方法之間不同的帖子,但是有一個我無法理解的問題。兩者之間抽象工廠vs工廠方法:組成VS Inplement?

一個區別是用抽象工廠 圖案,一類代表對象實例化 的另一個目的通過組合物而工廠方法模式 責任使用繼承和依賴於一個子類來處理所需的對象 實例

也許我知道爲什麼抽象工廠模式應用組合物和代表創建的對象,但我不明白爲什麼工廠方法模式使用繼承來創建具體的類的對象。

回答

4

抽象工廠

public interface IMyFactory 
{ 
    IMyClass CreateMyClass(int someParameter); 
} 

用法:

public class SomeOtherClass 
{ 
    private readonly IMyFactory factory; 

    public SomeOtherClass(IMyFactory factory) 
    { 
     this.factory = factory; 
    } 

    public void DoSomethingInteresting() 
    { 
     var mc = this.factory.CreateMyClass(42); 
     // Do something interesting here 
    } 
} 

注意SomeOtherClass依賴於組成與一個IMyFactory實例組成。

工廠方法

public abstract class SomeOtherClassBase 
{ 
    public void DoSomethingInteresting() 
    { 
     var mc = this.CreateMyClass(42); 
     // Do something interesting here 
    } 

    protected abstract IMyClass CreateMyClass(int someParameter) 
} 

用法:

public class SomeOtherClass2 : SomeOtherClassBase 
{ 
    protected override IMyClass CreateMyClass(int someParameter) 
    { 
     // Return an IMyClass instance from here 
    } 
} 

注意這個例子依賴於繼承工作。

+0

+1簡單 –

+0

好吧,我明白,但哪種風格更好,有什麼優勢?或者我們可以使用其中的任何一種? – grep

+0

如果您*贊成組合優於繼承*,應該清楚您應該贊成哪一個;) –