Абстрактная фабричная картина - PullRequest
3 голосов
/ 11 июня 2010

Это касается шаблона Абстрактной фабрики.

Поскольку мы знаем, что мы можем использовать 2 способа, т.е.

  1. Либо создайте экземпляр конкретного класса напрямую, либо
  2. Предоставить интерфейс, с помощью которого мы можем получить доступ к конкретному классу

Может ли кто-нибудь сказать о преимуществах / недостатках, что если я использую вариант 1, то это могут возникнуть проблемы, или, наоборот, если это возможно, с примером в реальном времени.

Заранее спасибо ...

Ответы [ 2 ]

1 голос
/ 11 июня 2010

Непосредственное создание объектов, безусловно, легко (примеры в C #):

public class Consumer()
{
    public void DoStuff()
    {
        var f = new Foo()
        f.DoIt("bar");
    }
}

Хотя это легко, это приводит к жесткой связи потому что вы не можете варьировать экземпляр независимо от потребителя.

Будучи более сложным , потребитель, использующий абстрактную фабрику, слабо связан :

public class Consumer()
{
    private readonly IFooFactory fooFactory;

    public Consumer(IFooFactory fooFactory)
    {
        if (fooFactory == null)
        {
            throw new ArgumentNullException("fooFactory");
        }

        this.fooFactory = fooFactory;
    }

    public void DoStuff()
    {
        var f = this.fooFactory.Create();
        f.DoIt("bar");
    }
}

Это выглядит безумно сложнее, чем в первой версии, но теперь вы можете изменять реализацию f независимо от Consumer.

Не только вы сможете изменить реализацию , но вы также можете повторно использовать или делиться экземплярами между различными потребителями.

Во многих случаях вам не требуется абстрактная фабрика для включения слабой связи.Зачастую вы можете просто вводить зависимости непосредственно в потребителей, вместо того чтобы прибегать к этому дополнительному уровню косвенности.

0 голосов
/ 11 июня 2010

Если у вас есть конкретный класс, который не является подклассом, и вы уверены, что его никогда не будет, тогда вы можете просто создать его экземпляр, как в вашем варианте 1 - для этого не требуется фабрика.

Если у вас есть интерфейс / абстрактный класс с несколькими конкретными подклассами, и вы хотите иметь возможность варьировать реализации без привязки клиента к какой-либо из них - это когда вы используете factory ( внедрение зависимости ).

...