如何正确处理复杂的对象创建,即使对象具有类似的构造函数



处理复杂对象创建的最佳设计模式或方法是什么?如果某些对象具有相同的构造函数,此模式是否应该更改?

我有一个工厂模式类,其中包含生成所需对象所需的常量。创建对象时,开发人员应传入他们选择的常量。其中一些对象只是父构造函数,但其他对象可能更复杂。

这里的构建器设计模式会更好吗?

class IbmApiRequestTypeBuilder {
    const INSTRUMENT_REQUEST = array("id" => 0,
        "requestUrl" => "/instrument/requestInstrumentList",
        "requestType" => "post",
        "requestBodyHead"=>"RequestInstrumentList",
        "requestBody" => "requestInstrumentList");
    const CREATE_SESSION_REQUEST = array("id" =>1,
        "requestUrl" => "/instrument/requestSession",
        "requestType" => "post",
        "requestBodyHead"=>"requestSession",
        "requestBody"=>"sessionRequest");

    public static function createApiRequestType($type) {
        $requestObj = null;
        switch($type['id']) {
            case 0:
                $requestObj = new IbmApiRequestInstruments($type['requestUrl'],
                $type['requestType'],
                $type['requestBodyHead'],
                $type['requestBody']);
            break;
        case 1:
            $requestObj = new IbmApiRequestSession($type['requestUrl'],
                $type['requestType'],
                $type['requestBodyHead'],
                $type['requestBody']);
            break;
         }
        return $requestObj;
    }
}

如果type.id始终是如何创建请求对象的唯一条件。我会说这种工厂方法会起作用,我喜欢它的简单性。

另一方面,如果有很多配置,很多变体,我可能会选择更灵活的构建器模式。 在这种情况下,常量值可以用作默认值,构建器可以在使用时覆盖这些值。

但是如果你保持这个类不变,我会把它重命名为 IbmApiRequestTypeFactory 并将该方法重命名为 Simpler create($type)。由于它不是构建器,并且从上下文中它只能创建一种类型的对象。I

您的代码看起来factory method模式的良好候选者,我认为您只需要稍微简化一下,例如:

public static function createApiRequestType($type) {
    $requestObj = null;
    $className = '';
    switch($type['id']) {
        case 0:
            $className = 'IbmApiRequestSession';
            break;
        case 1:
            $className = 'IbmApiRequestInstruments';
            break;
     }
    return new $className($type['requestUrl'],
        $type['requestType'],
        $type['requestBodyHead'],
        $type['requestBody']
    );
}

最新更新