如何使用Factory方法创建对象,而不是提供替代对象构造函数

时间:2014-03-25 17:32:02

标签: php oop factory-pattern single-responsibility-principle

我在应用Factory Pattern时遇到了一些麻烦。

我有一个我通常称为Product($modelNumber, $wheelCount)的课程。但是在我重构的遗留代码的一部分中,我没有$ modelNumber,只有$ productID,其中{$ modelNumber,$ productID}之间的链接在数据库中(或者在我的情况下我可以对其进行硬编码,因为我目前只有少数产品。)

我需要能够使用$productId创建我的课程,但是如何?

使用Procedural方法我将有一个执行查找的函数,我会将该函数放在一个文件中,并将该文件包含在我需要进行查找的任何位置。这样做:

$modelNumber = modelLookup($productId)
Product($modelNumber, $wheelCount);

但是我如何使用面向对象的方式呢?

注意:我在这里发布了一个更详细的情况:https://softwareengineering.stackexchange.com/q/233518/119333这就是工厂模式(以及其他模式,如接口和函数指针传递)在概念上的建议,但是在尝试实现时我遇到了问题他们用PHP。这似乎是一个简单的问题,但我认为有几种方法可以做到这一点,我有点迷失方向。所以我需要一些帮助。

2 个答案:

答案 0 :(得分:1)

我在程序员交流中为您的SRP问题提供了概念性答案,但我想我可以在此处进行演示。

您基本上想要的是其他一些对象,它可以帮助您获取给定产品ID的型号。

class ProductModelNumberProvider {
    public function findByProductId($productId) {
        // The lookup logic...
    }
}

您的工厂应该提供 setter 构造函数,以便它可以在内部使用此对象来查找模型编号(如果需要)。所以基本上你最终会得到与此类似的ProductFactory

class ProductFactory {
    private $productModelNumberProvider;

    public function __construct(ProductModelNumberProvider $productModelNumberProvider) {
        $this->productModelNumberProvider = $productModelNumberProvider;
    }

    public function getProductByIdAndWheels($productId, $wheels) {
        $modelNumber = $this->productModelNumberProvider($productId);
        return $this->getProductByModelNumberAndWheels($modelNumber, $wheels);
    }

    public function getProductByModelNumberAndWheels($modelNumber, $wheels) {
        // Do your magic here...
        return $product;
    }
}

修改

第二个想法,因为设置ProductModelNumberProvider实例是强制性的,所以setter不是最好的方法。这就是我移动它以通过构造函数注入它的原因。

答案 1 :(得分:0)

我可以想到这样的事情:

$factory = new ProductBuilder();
$factory->buildFromProductId($productId, $wheelCount); //uses modelLookup() internally
$factory->buildFromModelNumber($modelNumber, $wheelCount); //just returns Product()

它基本上是在程序功能的基础上创建一个类,但它确实将创建类的逻辑与查找映射分开。