我有一个班级Motor
,我用它来提供各种电机规格。
我目前有以下方法作为Motor
类的一部分:
public function getIdFromModel($model)
{
$sql = "SELECT id FROM ... WHERE model = ...";
return process($sql);
}
public function getIdByFrame($size)
{
$sql = "SELECT id FROM ... WHERE size = ...";
return process($sql);
}
以上是用于从数据库获取电机id
的补充函数,当已知其他非id
参数时。然后使用id
来创建实际的电机。
在我能做之前:
$model = "ABC";
$motor = new Motor();
//retrieve ID
$id = $motor->getIdFromModel($model)
$motor-loadSpecs($id);
$motor = new Motor($id);
在我更改了我的课程结构以在id
创建时需要Motor
知识后,我的问题就出现了。现在我需要这样做:
$model = "ABC";
//retrieve ID
$id = $???->getIdFromModel($model)
$motor = new Motor($id);
问题
我使用什么结构/类/模式/函数代替上面的???
?
我知道我可以为上述两个函数创建一个类,但我觉得有一个更好的答案/模式,我想问。我没有看到含义用于创建一个只用于id-to-id方法的类。我想有一些意思。
答案 0 :(得分:1)
您通常会使用工厂模式。它可以是独立函数或静态类方法,具体取决于您希望如何实现它。
答案 1 :(得分:0)
我会让他们成为静态功能,是Motor的成员。
public static function getIdFromModel($model)
{
..
}
然后您可以调用该函数,而无需实例。
$id = Motor::getIdFromModel($model)
答案 2 :(得分:0)
工厂方法+支持方法
<强>用法:强>
$id = 17;
$model = "ABC";
$frame = "T123";
$factory = new MotorFactory();
//instantiation via various pieces of data
$motor = $factory->fromId($id);
$motor = $factory->fromModel($model);
$motor = $factory->fromFrame($frame);
工厂方法:
class MotorFactory
{
public function fromId($id)
{
return new Motor($id);
}
public function fromModel($model)
{
$id = $this->getIdFromModel($model);
return $this->fromId($id);
}
public function fromFrame($frame)
{
$id = $this->getIdFromFrame($frame);
return $this->fromId($id);
}
//supporting methods
private function getIdFromModel($model)
{
$sql = "SELECT id FROM ... WHERE model = ...";
return process($sql);
}
private function getIdFromFrame($size)
{
$sql = "SELECT id FROM ... WHERE size = ...";
return process($sql);
}
}