我正在寻找以下情况下的最佳实践(使用Laravel,但这并不相关):我有一个方法strokePet
,该方法根据请求的有效负载将实例化一个DogStroker
或CatStroker
类。 strokePet
方法是通过API端点调用的。
class PetController
{
public function strokePet($request)
{
if ($request->pet == 'dog') {
$stroker = new DogStroker;
else if ($request->pet == 'cat') {
$stroker = new CatStroker;
}
$stroker->stroke();
}
}
class DogStroker
{
public function stroke()
{
echo 'grr';
}
}
class CatStroker
{
public function stroke()
{
echo 'prr';
}
}
例如,创建PetStroker
接口是否有任何优势
interface PetStroker
{
public function stroke();
}
还是我缺少一些设计模式,这会使它更加面向对象? (我知道这可能会因为过于含糊而被标记出来。)
答案 0 :(得分:3)
我认为您正在寻找factory pattern。它允许封装提供的输入的对象选择,并返回仅实现给定接口的内容。
在您的情况下,工厂方法可能类似于:
public static function GetStroker($request) // or Create($pet), as suggested in comments
{
if ($request->pet == 'dog') { return new DogStroker; }
if ($request->pet == 'cat') { return new CatStroker; }
return new DefaultStroker; // or throw exception
}
然后,您可以使用它来检索正确的实现,对调用者隐藏选择逻辑。