当我需要在创建对象之前调用助手函数时,我应该使用什么设计模式


What design pattern do I use when I need to call a helper function before I create an object?

我有一个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);
    }
}