【发布时间】:2018-08-27 04:04:15
【问题描述】:
假设我有以下简单的类
<?php
class Variable
{
private $variableName;
private $variableValue;
public function __construct($name, $value)
{
$this->variableName = $name;
$this->variableValue = $value;
}
}
我将Variable 对象保存在以下Collection 类的集合中。
class Collection
{
private $items = array();
public function addItem($obj) {
// Code for adding an item
}
// Other methods delete, sort, filter, etc
}
另外,假设我正在使用一个非常不一致的 API 来导入一堆变量名称和值。 API 返回 JSON,但它实际上可以是任何东西。
我说 API 不一致,因为根据您的 URI,Variable 对象可能会以这种格式返回 $raw 数据:
{
"variables" : [
{
"name" : "variable_one",
"value" : "foo"
},
{
"name" : "variable_two",
"value" : "bar"
}
]
}
或者$raw 数据可以是这种格式:
{
"dataObject" : {
"variable_one" : "foo",
"variable_two" : "bar"
}
}
此外,这个 API 还在成熟中,我可以预见他们将来会对变量数据的$raw 格式进行不可预测的更改。
这是我当前使用$raw 数据获取Variable 对象集合的解决方案:
<?php
// Turn JSON into stdObject
$variableData = json_decode($raw);
// Collection object to hold the variables
$variables = new Collection()
if ( property_exists($variableData, 'variables') ) {
foreach ( $variableData as $variable ) {
// Use for the first type of JSON
$variables->addItem(
new Variable($variable->name, $variable->value)
);
}
} else {
foreach ($variableData as $key => $value) {
// Use for the second type of JSON
$variables->addItem(new Variable($key, $value);
}
}
这个解决方案的问题是,如果变量构造函数变得更复杂,或者不同格式$raw的数量可以增长,这个解决方案就会变得一团糟。
如果Variable 变得复杂并且需要VariableFactory,我需要为每种$raw 输入类型创建一个单独的工厂。如果$raw 输入的类型数量增加,上面的代码就会变成一大堆if 和elseif 语句。
是否有一个好的设计模式可以用于不同的$raw 输入来创建Variable 对象的Collection?
【问题讨论】:
标签: php design-patterns factory-pattern