我有一个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
的补充函数。然后使用CCD_ 5来创建实际的电动机。
在我能做之前:
$model = "ABC";
$motor = new Motor();
//retrieve ID
$id = $motor->getIdFromModel($model)
$motor-loadSpecs($id);
$motor = new Motor($id);
在Motor
创建时,我改变了班级结构,要求了解id
,之后我的问题就出现了。现在我需要做:
$model = "ABC";
//retrieve ID
$id = $???->getIdFromModel($model)
$motor = new Motor($id);
问题
我用什么结构/类/模式/函数来代替上面的???
?
我知道我可以为上面两个函数创建一个类,但我觉得有一个更好的答案/模式,我想问一下。我看不出的意思是,因为它创建了一个类来识别方法。我想要一些意义。
您通常会为此使用Factory模式。它可以是一个独立的函数,也可以是静态类方法,这取决于您想要如何实现它
http://www.oodesign.com/factory-pattern.html
我会让它们成为静态函数,成为Motor的成员。
public static function getIdFromModel($model)
{
..
}
然后,您可以在不需要实例的情况下调用该函数。
$id = Motor::getIdFromModel($model)
工厂方法+支持方法
用法:
$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);
}
}