То, что вы описываете - это шаблон фабрики, так что да, это лучшая практика.
http://www.devshed.com/c/a/PHP/Design-Patterns-in-PHP-Factory-Method-and-Abstract-Factory/
Ваша фабрика не нуждается в реализации интерфейса.Это может быть статический класс или даже функция:
class PickupPointFactory{
public static function create($type){
/* your creation logic here */
switch ($type) {
case "PickupPoint1" :
$obj = new PickupPoint1();
break;
case "PickupPoint2" :
$obj = new PickupPoint2();
break;
}
return $obj;
}
}
$newPoint = PickupPointFactory::create("PickupPoint2");
Логика создания может быть намного более общей, чтобы избежать изменения фабрики при каждом добавлении класса в приложение:
class PickupPointFactory{
public static function create($type, $options){
/* your creation logic here */
if(file_exists(dirname(__FILE__).'/'.$type.'.class.php')) {
require_once(dirname(__FILE__).'/'.$type.'.class.php');
$obj = new $type($options);
return $obj;
} else {
throw new Exception('Unknown PickupPoint type: '.$type);
}
}
}
$newPoint = PickupPointFactory::create("PickupPoint2", array());
Предполагается, что вы создаете свои классы в файлах с именем "PickupPoint1.class.php" в том же каталоге, что и фабрика, и что конструктору в ваших классах нужен только один параметр.
Iне проверял этот код, поэтому, возможно, произошла ошибка.