Фабричный метод отлично работает, когда все параметры создания моего объекта четко определены. Однако при работе с унаследованным кодом, по умолчанию кажется, что он «молча терпит неудачу» или пишет конструкции кода, которые предотвращают попадание недопустимых данных в фабричный метод.
Что обычно входит в 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
}
}
}
Бросить InvalidArgumentException
, Кто-то пытается создать экземпляр объекта, о котором ваша фабрика не знает.
Если я правильно понимаю
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 для объекта … Если я правильно вас понял.