用于条件实例化类的PHP设计模式

时间:2019-05-02 14:01:14

标签: php oop design-patterns

我正在寻找以下情况下的最佳实践(使用Laravel,但这并不相关):我有一个方法strokePet,该方法根据请求的有效负载将实例化一个DogStrokerCatStroker类。 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();
}

还是我缺少一些设计模式,这会使它更加面向对象? (我知道这可能会因为过于含糊而被标记出来。)

1 个答案:

答案 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
}

然后,您可以使用它来检索正确的实现,对调用者隐藏选择逻辑。

相关问题