Непосредственное создание объектов, безусловно, легко (примеры в 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
.
Не только вы сможете изменить реализацию , но вы также можете повторно использовать или делиться экземплярами между различными потребителями.
Во многих случаях вам не требуется абстрактная фабрика для включения слабой связи.Зачастую вы можете просто вводить зависимости непосредственно в потребителей, вместо того чтобы прибегать к этому дополнительному уровню косвенности.