【问题标题】:Pattern Factory PHP, what advantages Can I have?模式工厂 PHP,我能有什么优势?
【发布时间】:2016-05-13 21:37:21
【问题描述】:

我想提高我对 PHP 模式和体系结构的了解。 我创建了一个使用工厂模式的愚蠢示例

这是我的代码:

index.php

$shape = Shape::getShape('circle', 3);
echo $shape->getArea();

shapes.php

class Shape
{

    public static function getShape($type, $num)
    {
        switch ($type) {
            case 'circle':
                return new Circle($num);
                break;
            case 'square':
                return new Square($num);
                break;
            default:
                throw new Exception("Unrecognized shape");
        }
    }
}


abstract class Form{
    abstract public function getArea();
}

class Circle extends Form{
    protected $_type = "Circle";
    private $area;
    /**
     * circle constructor.
     * @param $area
     */
    public function __construct($area)
    {
        $this->area = $area;
    }
    public function getArea(){
          return $this->area*pi();
    }
}

使用这种方法的优势在哪里?

我可以做到,创建圆形对象

$circle = new Circle(3);
echo $circle->getArea();

我可以看到使用工厂模式的唯一优势是,我不知道用户想要哪种形状。

【问题讨论】:

    标签: php design-patterns factory-pattern


    【解决方案1】:

    像你这样简单的例子,没有任何真正的好处;但真正的工厂通常会应用业务逻辑来确定要实例化哪个类,而不是告诉它您希望它返回哪个类。

    在您的示例中,您具体说明了您想要什么形状,然后它只是返回一个适当类型的对象;但是假设你只知道你有多少个角,并将这些角传递给工厂,然后它可以确定要返回什么形状的对象......你已经移动了知道 3 个角意味着一个三角形的逻辑,4角对工厂来说意味着正方形等。

    这仍然是一个过于简单化的例子,但也许至少证明了工厂模式的一个好处。

    工厂还可以处理对对象的依赖注入:工厂应该知道依赖关系,而调用代码无权访问依赖关系,甚至不知道它们可能是什么,因此无法实例化自己需要的类。

    【讨论】:

    • 谢谢。在您的示例中(3 或 4 个角),我可以在调用代码而不是工厂代码中进行切换。为什么这种方法不好?例如,我可以在三角形类中使用依赖注入。当然,我可以通过多种方式获得相同的结果。
    • 您总是可以通过将逻辑放在主调用代码中来避免使用工厂类....但是如果您必须在代码中的不同点创建形状,您要么重复该逻辑或者您调用一个处理它的类/方法以避免重复;更好地在自己的类中保证 SOLID 的 SRP(单一责任原则),马上你就有了工厂
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2012-02-26
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多