Что должно идти в случае по умолчанию оператора switch внутри Factory Method?

Фабричный метод отлично работает, когда все параметры создания моего объекта четко определены. Однако при работе с унаследованным кодом, по умолчанию кажется, что он «молча терпит неудачу» или пишет конструкции кода, которые предотвращают попадание недопустимых данных в фабричный метод.

Что обычно входит в default: случай оператора switch внутри фабричного метода?

Пример ниже …

class Factory
{

function getObject($param)
{
switch ($param)
{
case 'a':
return new A();
case 'b':
return new B();
default:

//OPTION 1
//break code execution?  Sometimes it's not desirable
//especially in production code as introducing an
//Exception breaks previous legacy code behavior
throw new \RuntimeException($message, $code, $previous);

//OPTION 2
//fail silently? - sometimes that's the desired behavior
//dummy object is created does nothing, and is then
//discarded and code execution goes on, but creating
//a dummy object does not seems like the right way to address the issue
return new fakeDummyObject();

//OPTION 3
//3rd way is to construct code that never reaches
//default:; switch statement.  This requires
//more work on the legacy code side
}
}
}

0

Решение

Бросить InvalidArgumentException, Кто-то пытается создать экземпляр объекта, о котором ваша фабрика не знает.

2

Другие решения

Если я правильно понимаю

class Factory
{

private $_classes = array();

function getObject($param,$constParam = null)
{
//check exist object exist
if(isset($this->_classes[$param])) {
return $this->_classes[$param];
}

$className =  strtoupper($param);
//check class exist
if(!class_exists($className)) {
return new fakeClass(); //or exception
}

// if don't passed params to construct
if(is_null($constParam)) {
$this->_classes[$param] = new $className();
return $this->_classes[$param];
}

// else params passed to construct
$this->_classes[$param] = new $className($constParam);
return $this->_classes[$param];
}
}

Это примитивная реализация функции getter для объекта … Если я правильно вас понял.

0

По вопросам рекламы [email protected]