处理复杂对象创建的最佳设计模式或方法是什么?如果某些对象具有相同的构造函数,此模式是否应该更改?
我有一个工厂模式类,其中包含生成所需对象所需的常量。创建对象时,开发人员应传入他们选择的常量。其中一些对象只是父构造函数,但其他对象可能更复杂。
这里的构建器设计模式会更好吗?
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']
);
}