Объектная инициализация и объектные фабрики в C ++ - PullRequest
5 голосов
/ 22 августа 2011

Я довольно новичок в разработке и дизайне c ++ и поэтому заранее прошу прощения, мой вопрос расплывчатый или плохо структурированный.У меня есть несколько различных и не связанных между собой иерархий в моем коде, и я хотел бы использовать универсальную фабрику, описанную и реализованную Александреску, для создания экземпляров объектов из этих иерархий.
Часть, с которой я сталкиваюсь, - это фаза инициализации.У классов очень разные потребности в инициализации.Иногда данные, необходимые для инициализации, могут быть найдены из хранилища (БД), и в этих случаях я могу инкапсулировать процедуру инициализации в некотором методе Init () определенного класса.Но в других случаях данные известны только локально в момент создания экземпляра и должны быть переданы объекту вручную.Я изо всех сил пытаюсь придумать единый способ сделать это.Есть ли у кого-нибудь какие-либо материалы по решению таких проблем?Спасибо

Ответы [ 2 ]

4 голосов
/ 22 августа 2011

Вы несетесь по шоссе Over-Engineering ... идите первым.

Фабрики требуются редко, и нет двух одинаковых Фабрик (как вы заметили).

Бесполезно пытаться предоставить базовый класс для всех ваших фабрик, потому что у этого базового класса не будет четкой семантики. Что это строит? Bird с? Car с? Они не связаны ... Object с? Это не Java!

Если вы хотите использовать фабрики (по какой-то причине), тогда Factory должен создавать объекты 1 , все из которых происходят из общего базового класса. Если у вас есть несколько видов объектов, вам понадобятся несколько видов фабрик.

И если вы обнаружите, что заводской код повторяется, используйте шаблон, чтобы поднять общий код.

0 голосов
/ 22 августа 2011

Если я правильно угадал, ваша проблема в том, что вы не знаете, как передавать различные наборы аргументов в фабричные методы. Если это так, я могу посоветовать вам создать еще одну иерархию / Давайте назовем ее FactoryHelper. Конкретный класс этой иерархии будет содержать специальные данные для реализации ваших конкретных классов, например, FactoryHelperA для ConcreteProductA будет содержать строку, а FactoryHelperB для ProductB будет содержать int. Абсолютный метод вашей фабрики должен принимать абстрактный базовый класс - FactoryHelper в качестве аргумента. Конкретные методы вашей фабрики приведут этот аргумент к конкретному FactoryHelperA или FactoryHelperB и получат специальные данные для создания специального продукта

Но это не очень хороший дизайн. Я полагаю, вы пытаетесь использовать фабричные методы неправильно.

...