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

时间:2017-10-28 00:02:57

标签: design-patterns

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

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

建造者的设计模式会更好吗?

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;
    }
}

2 个答案:

答案 0 :(得分:0)

如果char[] charArray = new char[] { 'h', 'e', 'l', 'l', 'o', 'a' }; Arrays.sort(charArray); System.out.println(Arrays.binarySearch(charArray, 'a')); 始终是如何创建请求对象的唯一标准。我会说这个工厂方法会起作用,我喜欢它的简单性。

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

但是如果按原样保留这个类,我会将它重命名为IbmApiRequestTypeFactory并重命名该方法以简单地创建($ type)。因为它不是构建器,并且从上下文中它只能创建一种类型的对象。 我

答案 1 :(得分:0)

你的代码看起来像是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']
    );
}