在创建对象之前需要调用辅助函数时,我会使用什么设计模式?

时间:2015-11-09 21:42:12

标签: php oop design-patterns

我有一个班级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方法的类。我想有一些意思。

3 个答案:

答案 0 :(得分:1)

您通常会使用工厂模式。它可以是独立函数或静态类方法,具体取决于您希望如何实现它。

http://www.oodesign.com/factory-pattern.html

答案 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);
    }
}