Допустим на примере класса кэширования.
Нужно написать функционал для нескольких движков кэширования (Redis, File, SQLite).
С одной стороны можно написать CacheProvider описывающий общие методы для кэширования (get, set) и подключающий нужные "драйверы" через именованные конструкторы.
Примерно вот так я вижу использование:
$cache= CacheProvider::redis(array $cfg) //@return Redis instance
//Или
$cache = CacheProvider::driver(string CacheProvider::DRIVER_REDIS, array $cfg);
Минусы которые я вижу:
- При создании нового драйвера, нужно обновлять класс Cache и добавлять новый конструктор (В случае с "Или" - константу)
- Отслеживать чтоб, Кол-во конструкторов было равно кол-ву драйверов (В случае с "Или" - константы)
- Появится дополнительная зависимость от класса посредника CacheProvider
С другой стороны, можно написать интерфейс и имплементировать его непосредственно в классах RedisCache, FileCache
Использование:
$cache = new RedisCache(array $cfg);
В этом методе пока не вижу минусов. Если они все же есть, откройте мне глаза. Гуглил Interface vs Provider Но внятного не нашел.