Вы говорите о фабричном методе или абстрактной фабрике?
Основная проблема, которую решают оба - позволить клиентам указывать точный класс, который конструирует код фреймворка. Например, если вы предоставляете интерфейс, который могут реализовать клиенты, а затем в вашем коде есть что-то вроде:
IMyInterface x = new ConcreteClass();
Клиенты не могут изменить точный класс, созданный без доступа к этому коду.
Фабричный метод - это виртуальный метод, который создает конкретный класс определенного интерфейса. Клиенты вашего кода могут предоставить объект, который переопределяет этот метод, чтобы выбрать класс, который вы хотите создать. Это может выглядеть так в вашем коде:
IMyInterface x = factory.Create();
factory
передан клиентом и реализует интерфейс, который содержит Create () - они могут определить точный класс.
Абстрактная фабрика должна использоваться, если у вас есть иерархия связанных объектов и вам нужно писать код, который взаимодействует только с базовыми интерфейсами. Абстрактная фабрика содержит несколько фабричных методов, которые создают конкретные конкретные объекты из каждой иерархии.
В книге «Банды четырех» Design Patterns они приводят пример лабиринта с комнатами, стенами и дверями. Код клиента может выглядеть так:
IRoom r = mazeFactory.CreateRoom();
IWall nw = mazeFactory.CreateWall();
IWall sw = mazeFactory.CreateWall();
IWall ew = mazeFactory.CreateWall();
IWall ww = mazeFactory.CreateWall();
r.AddNorthWall(nw);
r.AddSouthWall(sw);
r.AddEastWall(ew);
r.AddWestWall(ww);
(и т. Д.)
Точные бетонные стены, комнаты, двери могут быть определены разработчиком mazeFactory, который будет реализовывать предоставленный вами интерфейс (IMazeFactory).
Итак, если вы предоставляете интерфейсы или абстрактные классы, которые, как вы ожидаете, будут реализовывать и предоставлять другие люди, - тогда фабрики - это способ предоставить вашему коду способ конструировать их конкретные классы, когда они вам нужны.