设计模式——抽象工厂vs工厂方法;组合vs继承



我读了很多关于抽象工厂和工厂方法的区别的文章,但是有一个问题我不能理解。

两者之间的区别在于抽象工厂模式中,类委托对象实例化的责任到另一个对象,而工厂方法模式使用继承并依赖于子类来处理所需的对象实例化

也许我知道为什么抽象工厂模式使用组合和委托来创建对象,但我不明白为什么工厂方法模式使用继承来创建具体的类对象。


这个问题不是关于抽象工厂是什么或工厂方法是什么,因此这里没有答案

这是关于为什么工厂方法似乎使用继承,而客户端也可以直接调用工厂方法。

抽象工厂

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依赖于Composition来与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
    }
}

最新更新