2014-03-25 94 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

如果您*赞成组合优于继承*,应该清楚您应该赞成哪一个;) –