Я работаю над реализацией класса Factory в соответствии с тем, что предлагается в этом ответе на предыдущий вопрос:
Реализация метода фабрики - C ++
Это фабрика, которая хранит карту от строк до функций создания объектов, поэтому я могу запрашивать различные типы объектов из фабрики по строковому идентификатору.Все классы, которые производит эта фабрика, будут наследоваться от абстрактного класса (Connection), обеспечивающего общий интерфейс для соединений по различным протоколам (HTTPConnection, FTPConnection и т. Д.)
Я хорошо понимаю, как метод связанвышеописанное работает, и это работает.
Там, где у меня возникают проблемы, я пытаюсь выяснить механизм предотвращения создания экземпляров объектов Connection без использования Factory.Для того, чтобы Фабрика могла выполнять свою работу, мне нужно предоставить ей функцию создания объекта для хранения на ее карте.Я не могу предоставить ему конструктор, потому что вы не можете создавать функциональные указатели на конструкторы.Таким образом, как и в приведенной выше ссылке, должна быть отдельная функция создания объекта для возврата новых объектов.Но чтобы сделать это, мне нужно сделать эту функцию создания либо статическим методом класса, к которому клиентский код сможет получить доступ, либо отдельной функцией, которая потребует либо:или б) сделать конструктор частным и сделать функцию создания члена, не являющегося членом класса, другом, который не наследуется и не может быть принудительно реализован абстрактным базовым классом.
Точно так же, если бы я просто подружился с классом Фабрики с классами Соединения, которые он должен был производить, чтобы он мог обращаться к их частным конструкторам, это работало бы, но я не мог применять через базовый класс abstact, потому что друзьяне наследуютсяКаждый подкласс должен был бы явно дружить с Фабрикой.
Может кто-нибудь предложить метод реализации того, что я описал выше?
Чтобы повторить требования:
1- Фабрика, которая производит различные объекты, все производные от одного и того же базового класса на основе переданного в идентификаторе в метод фабрики Create.
2 - Все подклассы, которые фабрика должна будет создать, автоматически зарегистрируют функцию создания.и идентификатор с фабрикой (см. связанный ответ SO выше)
3 - Все производимые фабрикой подклассы не должны быть инстанцируемыми (инстантируемыми?) без прохождения через фабрику
4 - Enforce# 3 явно как часть абстрактного базового класса с использованием наследования.Удалите возможность для кого-то создавать подклассы из абстрактного базового класса, одновременно предоставляя механизмы для свободного создания экземпляров объектов.
Общая цель того, чего я пытаюсь достичь, состоит в том, чтобы разрешить добавление новых типов соединений в иерархию.без необходимости каким-либо образом изменять класс Factory, а также заставлять все подклассы Connection не быть экземплярами непосредственно клиентским кодом.
Я открыт для вероятности того, что это не лучший способ достичь того, чего я хочу, и предложения других альтернатив приветствуются.
РЕДАКТИРОВАТЬ - добавит некоторые фрагменты кода, когдаЯ вернусь домой, чтобы, надеюсь, прояснить это.