Реализация фабричного метода с абстрактным классом
Возникла следующая проблема. Реализовал паттерн Фабричный метод на основе обобщенного конструктора(с помощью статического метода getFigure в классе Figure).
abstract class Figure{
static function getFigure(string $type)
{
switch ($type){
case "Rectangle": return new Rectangle(); break;
case "Circle": return new Circle(); break;
default: echo "Неправильный параметр"; return null; break;
}
}
abstract function draw();
}
class Rectangle extends Figure{
function draw(){ echo "Rectangle"; }
}
class Circle extends Figure{
function draw(){ echo "Circle"; }
}
Все работает, но есть один нюанс:
Сам статичный метод вызывается так:Figure::getFigure('Circle')->draw();
НО проблема в том, что это статичный метод так же наследуется и подклассами, и соотвественно я могу вызвать его так:Circle::getFigure('Circle')->draw();
Так вот вопрос, как мне можно ограничить вызов статического метода в наследуемых классах?
Конечно можно просто переопределить в каждом классе так, Но ведь это очень неудобно прописывать это в каждом классе:
static function getFigure(string $type){}
Ответы (1 шт):
Вы используете Статическую Фабрику. Текущая форма реализации не совсем верна. Фабрика должна лишь создать объект, но не содержать никакой логики данного объекта.
class FigureFactory
{
static function build(string $type)
{
switch ($type){
case "Rectangle":
return new Rectangle();
case "Circle":
return new Circle();
default:
echo "Неправильный параметр";
return null;
}
}
}
interface Figure
{
public function draw();
}
class Circle implements Figure
{
function draw()
{
echo "Circle";
}
}
FigureFactory::build('Circle')->draw(); // Circle
Circle::build('Circle')->draw(); // Uncaught Error