Абстрактный шаблон фабричного дизайна для создания объектов? Почему мы не можем просто использовать новый оператор? - PullRequest
5 голосов
/ 03 июня 2010

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

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

Спасибо заранее. Харша Т

Ответы [ 7 ]

2 голосов
/ 03 июня 2010

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

Ссылка для абстрактной фабрики

2 голосов
/ 04 июня 2010

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

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

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

Везде в вашем коде, когда вы захотите изменить все экземпляры Foo , чтобы использовать экземпляры Bar , вы действительно собираетесь искать / заменять?


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

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

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

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

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

2 голосов
/ 03 июня 2010

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

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

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

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, чтобы решить, какую базовую фабрику я хочу создать на основе определенных идентификаторов версий. Это позволяет мне подключать новые версии по мере необходимости, не нарушая существующую инфраструктуру, что оказывается полезным в этом случае. Фактически, это позволило бы мне подключить совершенно новые продукты, если бы мне это было нужно, что в целом может быть полезно, но в моем случае не стоит усилий по реализации.

0 голосов
/ 03 июня 2010
  • Прежде всего вам не нужно знать конкретный тип объекта, который создается вашей фабрикой,
  • тогда вы можете подключить ваши фабричные классы к вашему проекту, позволяя им создавать объекты для ваших компонентов без использования new в вашем коде. Фабрика уже делает свою грязную работу
  • концептуально отделяет создание объектов от их использования, сохраняя связь между собой
0 голосов
/ 03 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...