Инкапсуляция создания (Encapsulating creation)


Когда вы обнаруживаете, что вам нужно добавить новые типы в систему, наиболее разумным первым шагом является использование полиморфизма для создания общего интерфейса для этих новых типов. Это отделит большую часть кода вашей системы от необходимости знания типов, которые вы добавляете. Новые типы могут быть добавлены без разрушения существующего кода или его структуры. Первоначально может показаться, что при таком дизайне вам необходимо внести изменения только в тот код, где вы наследуете новые типы, но это не полная правда. Вы все еще должны создать объект нового типа и в точке создания вы должны указать точный тип используемого конструктора. Таким образом, если код, создающий объекты, разнесен по всему вашему приложению, вы получаете ту же проблему, когда добавляете новые типы - вы должны выискивать все места в вашем коде, где этот тип встречается. Это происходит при создании типа, которое, в данном случае, имеет больше значения, чем использование типа (о котором позаботится полиморфизм), но эффект тот же: добавление нового типа может вызвать проблемы.

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

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

Хотя Метод Простейшей Фабрики на самом деле является синглетоном, вы найдете, что любой указанный класс фабрики в более общих случаях должен иметь только один экземпляр.