我在应用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。这似乎是一个简单的问题,但我认为有几种方法可以做到这一点,我有点迷失方向。所以我需要一些帮助。
答案 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()
它基本上是在程序功能的基础上创建一个类,但它确实将创建类的逻辑与查找映射分开。