Абстрактная фабрика против фабричного метода: композиция против "Дополнения"?

Я прочитал много сообщений о разных методах абстрактной фабрики и фабрики, но есть проблема, которую я не могу понять.

Одна разница между ними заключается в том, что с шаблоном Abstract Factory класс делегирует ответственность за экземпляр объекта на другой объект посредством композиции, тогда как шаблон Factory Method использует наследование и полагается на подкласс для обработки требуемого экземпляра объекта

Может быть, я знаю, почему шаблон Abstract Factory использует состав и делегаты для создания объекта, но я не могу понять, почему шаблон Factory Method использует наследование для создания конкретных объектов класса.

+1
источник поделиться
1 ответ

Абстрактная фабрика

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
    }
}

Обратите внимание, что этот пример основан на наследовании для работы.

+4
источник

Посмотрите другие вопросы по меткам или Задайте вопрос