Заводской объект вызывает исключение stackoverflow из-за зависимости от самого себя - PullRequest
2 голосов
/ 24 июня 2011

У меня есть фабричный объект c #, который создает объекты с помощью фабричных методов, используя список объектов в качестве источника.

Список объектов создается так:

public WidgetFactory()
    {
        widgetLibrary = new List<WidgetModel>();

        //Add all widgets
        widgetLibrary.Add(new ClientsWidget());
        widgetLibrary.Add(new InstallationsWidget());
        etc.

и различные части моего приложения обращаются к этому списку по-разному, чтобы получить нужный тип объекта.

Но теперь у меня есть требование, чтобы один из объектов в списке (т.е. виджет) использовал саму фабрику виджетов. Очевидно, что это вызывает круговую ссылку.

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

Ответы [ 4 ]

4 голосов
/ 24 июня 2011

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

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

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

Если вам абсолютно необходимо это сделать, то наилучшим подходом может быть ленивая реализация объектовна фабрике.Вместо того, чтобы ваш WidgetFactory содержал List<WidgetModel> внутри, вы можете использовать List<Lazy<WidgetModel>>.Это позволило бы отдельным «виджетам» оценивать только по мере необходимости, что означало бы, что когда рассматриваемый виджет пытается ссылаться на фабрику, он будет полностью загружен.

1 голос
/ 24 июня 2011

Конструктор для WidgetFactory не должен вызывать конструкторы вещей, которые он строит. Вместо этого WidgetFactory должен иметь метод (BuildWidgets), который выполняет всю работу.

Тогда другие объекты могут использовать фабрику, не вызывая этот каскад активности снова.

1 голос
/ 24 июня 2011

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

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

Ваша модель неверна.После того, как автомобиль сошел с конвейера на заводе NUMMI, он не зависит от правильной работы завода.

Кроме того, я подвергаю сомнению дизайн вашего завода.Почему вы new экземпляры конструктора.Какова цель этой порции?

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

0 голосов
/ 24 июня 2011

Для начала переместите создание виджета из конструктора WidgetFactory. Это должно происходить либо в методе инициализации, либо по запросу в методе CreateWidget (Type).

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

  1. Пусть WidgetFactory передает 'this' при создании виджета
  2. Используйте шаблон синглтона: добавьте статическое свойство WidgetFactory.Instance и инициализируйте его один раз; разрешить всем пользователям WidgetFactory доступ к свойству, а не создавать новый экземпляр.
  3. Использовать шаблон внедрение зависимостей - здесь сложно дать краткое описание.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...