Я думаю, что образец здесь основан на наборе классов. Я использовал это для наборов классов, где классы были связаны тем, как они обращаются к базе данных.
Поэтому у меня будет абстрактный класс с именем NWindAbstractFactory . Этот класс будет иметь два абстрактных метода, которые будут возвращать IProductRepository и IOrderRepository . Вы не могли ничего реализовать напрямую, но ваша бизнес-логика была запрограммирована на эту абстрактную фабрику и интерфейсы.
Я бы тогда создал конкретную реализацию IProductRepository и IOrderRepository. Возможно, они назывались SqlProductRepository и SqlOrderRepository . Затем я мог бы создать конкретную реализацию моей абстрактной фабрики, и она была бы названа примерно как NWindSqlFactory .
Возможно, у меня была бы другая конкретная фабрика с именем NWindXMLFactory , которая смогла создать XmlProductRepository и XmlOrderRepository .
Затем я мог бы решить во время выполнения, какую реализацию моей абстрактной фабрики я хотел бы использовать. Может быть, NWindSqlFactory или NWindXMLFactory или, может быть, даже NWindAccessFactory.
Опять же, я думаю, что это работает, когда у вас есть связанный набор классов, но вы не хотите программировать против их конкретной реализации.
Вы можете использовать параметр конфигурации, который будет использовать отражение, чтобы создать экземпляр фактической реализации, которую вы хотели. И вы можете сделать это только с одной настройкой. Вам нужно только указать конкретную фабрику --- потому что, имея бетонную фабрику, она может получить все остальные реализации.