Абстрактный шаблон разработки Фабрики для создания объектов? Почему мы не можем только использовать новый оператор?

почему нам нужен Абстрактный шаблон разработки Фабрики для создания объектов? Почему мы не можем только использовать новый оператор? ответ, для предотвращения трудного coupleing объектов. Но я не понял как? может любой объяснять с кодом (будет очень полезно).

что делает абстрактный шаблон разработки фабрики полезным и когда.

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

5
задан Harsha 3 June 2010 в 14:31
поделиться

7 ответов

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

2
ответ дан 14 December 2019 в 08:43
поделиться

В Википедии есть неплохой пример C #. Это избавляет ваш код уровня приложения от необходимости знать, какие реализации он получает. Об этом позаботится фабрика.

0
ответ дан 14 December 2019 в 08:43
поделиться

Вот простой пример, взятый из слоя независимости версий, который я построил для нашего продукта:

interface ICadSystemFactory
{
    ICadSystem GetSystemInstance();
}

class 3dCadSystemVersion1 : ICadSystemFactory
{
    ICadSystem GetSystemInstance()
    {
        return new 3dCadSystemWrapperVersion1(new 3dCadSystemVersion1());
    }
}



class 3dCadSystemVersion2 : ICadSystemFactory
{
    ICadSystem GetSystemInstance()
    {
        return new 3dCadSystemWrapperVersion2(new 3dCadSystemVersion2());
    }
}

Где объекты 3dCadSystemWrapperVersionX реализуют интерфейс ICadSystem. Я использую объект Registry, чтобы решить, какую базовую фабрику я хочу создать на основе определенных идентификаторов версий. Это позволяет мне подключать новые версии по мере необходимости, не нарушая существующую инфраструктуру, что оказывается полезным в данном случае. Фактически, это позволит мне подключать совершенно новые продукты, если мне это понадобится, что в целом может быть полезно, но в моем случае не стоит усилий по реализации.

1
ответ дан 14 December 2019 в 08:43
поделиться
  • во-первых, вам не нужно знать конкретный тип объекта, который инстанцирует ваша фабрика,
  • тогда вы можете подключать классы фабрики по всему проекту, позволяя им инстанцировать объекты для ваших компонентов без необходимости использовать new в вашем коде. Фабрика уже делает свою грязную работу
  • она концептуально отделяет инстанцирование объекта от его использования, сохраняя вещи развязанными
0
ответ дан 14 December 2019 в 08:43
поделиться

Шаблон проектирования абстрактной фабрики предназначен для создания объекта с определенной настройкой во время инициализации. Например, если у вас много одинаково связанных классов, вместо того, чтобы повторять одни и те же строки 4+ [и использовать копирование и вставку], абстрактная фабрика позволит вам сохранить 4+ строки в одном месте и уменьшить количество необходимы изменения.

Справочник по абстрактной фабрике

2
ответ дан 14 December 2019 в 08:43
поделиться

Используя абстрактную фабрику, вы можете создавать объекты без знания фактического типа. Допустим, вам нужен IDictionary. Вы можете либо создать новый экземпляр класса бинарного дерева, который вам знаком, либо сообщить фабрике IDictionary, что вам нужен новый экземпляр. Тогда кто-то другой может создать фабричную реализацию, которая возвращает хеш-таблицы, но все на вашей стороне будет работать так же.

0
ответ дан 14 December 2019 в 08:43
поделиться

Если у вас есть:

class Foo implements DoSomething {...}
class Bar implements DoSomething {...}

obj = new Foo();
obj.doSomething();

Повсюду в коде, если вы хотите изменить все экземпляры Foo для использования экземпляров Bar , вы действительно собираетесь выполнить поиск / замену?


Если у вас есть:

obj = DoSomethingFactory.create();
obj.doSomething();

Внутри DoSomethingFactory, вы можете вернуть любой объект, который реализует интерфейс DoSomething .

Используя Factory, вы получаете контроль над всеми объектами, которые она создает.

Если вы решите изменить способ создания объектов Factory, изменения немедленно вступят в силу в коде, который использует Factory.

2
ответ дан 14 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: