Фабричный метод пустой объект

У меня есть класс фабричного метода, который возвращает системный класс кеша (псевдокод):

class CacheFactory
{
    public static function get($type) {
        switch ($type) {
            case 'memcache': 
                return new Memcache();
            case 'redis': 
                return new Redis();
            case 'default': 
                return new Void();
        }
    }
}

Классы кеша реализуют простые методы get() и set() (он использует абстрактный класс, определяющий общие методы), что позволяет мне легко переключать системы кеша, если это необходимо. Обычное использование будет выглядеть так:

$cache = CacheFactory::get('redis');
$value = $cache->get('key');
...etc

Я хочу иметь настройку для включения/отключения кеша, но я не хочу добавлять в код условные выражения, спрашивающие, включен ли кеш или нет везде. Итак, я подумал о возврате объекта Void(), который реализует методы абстрактного класса, поэтому он будет использоваться, когда кеш отключен, класс будет выглядеть так:

class Void extends ACache
{
    public function get(){};
    public function set(){};
}

Будет ли это хорошим подходом? Как, по-вашему, будет лучший способ обработки включенного/отключенного параметра без добавления условных выражений в фактическую реализацию?

Спасибо!


person user3528035    schedule 13.04.2014    source источник
comment
Это шаблон NullObject. oodesign.com/null-object-pattern.html   -  person Mike Stockdale    schedule 13.04.2014
comment
@MikeStockdale спасибо!   -  person user3528035    schedule 13.04.2014
comment
Кэширование — это сквозная задача, поэтому лучше всего решать ее с помощью кэшей сквозного чтения, также более известных как декораторы. Подробнее см. здесь (просто мысленно замените слово Журналирование на Кэширование): stackoverflow.com/a/1709048/126014 См. также stackoverflow.com/a/7906547/126014   -  person Mark Seemann    schedule 13.04.2014
comment
@MarkSeemann пара вопросов: 1. В реальной реализации следует использовать декораторы, чтобы фабричный метод здесь все еще работал правильно? Например: $object = новый CacheDecorator(новая вещь()); Фабрику можно добавить как внедрение зависимостей или внутри CacheDecorator. 2. Если я добавлю декоратор кеша в качестве примера ведения журнала, как вы справитесь с кэшированием значений? Например, если я использую метод декоратора кеша doStuff() и значение находится в кеше, я бы не стал вызывать метод doStuff() для innerThing, и это разорвало бы цепочку для других декораторов, пожалуйста, поправьте меня, если я ошибаюсь.   -  person user3528035    schedule 14.04.2014
comment
1. Звучит правильно. 2. Верно. Некоторые декораторы «разрывают» цепочку; кеширующий декоратор часто делает это, поэтому важно составить их в правильном порядке.   -  person Mark Seemann    schedule 14.04.2014