Not quite right. The factory must create any object. For example extending one interface or abstract class.
<?php class HelloFactory { static $parentClass = "Hello"; /** * @param string $className * @return Hello * @throws \Exception */ public static function create($className) { if(!class_exists($className)) { throw new \Exception("ΠΠ»Π°ΡΡ $className Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½"); } if(!in_array(self::$parentClass, class_parents($className))) { throw new \Exception("ΠΠ»Π°ΡΡ $className Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ " . self::$parentClass); } $object = new $className(); // Π΄Π΅Π»Π΅Π³ΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ°ΠΌΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΈΠ½Π°ΡΠ΅ Π² ΡΠ°Π±ΡΠΈΠΊΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π»ΠΈΡΠ½Π΅ΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈ ΠΊΠΎΠ΄Π° $object->init(); return $object; } } abstract class Hello { public $message; // ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° abstract function init(); public function view() { return $this->message; } } class HelloWorld extends Hello { public function init() { $this->message = 'hello world!'; } } class HelloEveryBody extends Hello { public function init() { $this->message = 'hello everybody!'; } } $test = HelloFactory::create('HelloWorld'); echo $test->view() . PHP_EOL; $test2 = HelloFactory::create('HelloEveryBody'); echo $test2->view() . PHP_EOL; // ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ $test3 = HelloFactory::create('HelloAnyBody'); echo $test3->view() . PHP_EOL;