} class ProductFactory { // сама фабрика private $_types = []; public function __construct() { // массив из разрешенных типов $this->_types = ['keyboard' => 'keyboard', 'mouse' => 'mouse']; } public function make($product) { if (!array_key_exists($product['type'], $this->_types)) { // проверяем разрешен ли такой тип throw new InvalidArgumentException("Тип " . $product['type'] . " не найден!"); } $class_name = $this->_types[$product['type']]; // имя класса называется именем переданного типа return new $class_name($product); // создаётся объект нужного класса } } $products = [['id' => 1, 'model' => 'LOGITECH K810', 'price' => 150, 'type' => 'keyboard'], ['id' => 2, 'model' => 'LOGITECH WIRELES MOUSE G700', 'price' => 140, 'type' => 'mouse']]; $productsFactory = new ProductFactory(); $cart = []; foreach ($products as $product) { $cart[] = $productsFactory->make($product); } var_dump($cart); echo $cart[1]->getPrice(); // например достаём цену