Php 协助工厂模式的实施
我已经将这个问题标记为PHP,但更多的是关于设计模式的问题,即工厂模式;PHP就是我正在使用的编程语言 我正在建立一个房地产代理网站(美国表亲的“房地产”)。我有一个Php 协助工厂模式的实施,php,design-patterns,factory,factory-pattern,Php,Design Patterns,Factory,Factory Pattern,我已经将这个问题标记为PHP,但更多的是关于设计模式的问题,即工厂模式;PHP就是我正在使用的编程语言 我正在建立一个房地产代理网站(美国表亲的“房地产”)。我有一个Property类,但是其他类扩展了这个类,例如LettingProperty,CommercialProperty,它具有特定于该类型属性的字段 在我的控制器中,我想显示一个特定的属性。这很容易,因为我将属性ID作为参数传递。我的方法是创建一个工厂类,该类将属性作为相关类的实例返回。例如,如果ID为1的属性是出租属性,则返回Let
Property
类,但是其他类扩展了这个类,例如LettingProperty
,CommercialProperty
,它具有特定于该类型属性的字段
在我的控制器中,我想显示一个特定的属性。这很容易,因为我将属性ID作为参数传递。我的方法是创建一个工厂类,该类将属性作为相关类的实例返回。例如,如果ID为1的属性是出租属性,则返回LettingProperty
的实例。如果它只是一个标准的“待售”属性,属性的一个实例
我该怎么办?我创建了一个PropertyFactory
类,并实现了一个名为buildFromId()
的方法,但在创建一个优雅的解决方案时遇到了问题:
- 在my
数据库表中查找相关记录properties
- 执行任何
s(即,如果是出租属性左连接,则从左连接
(外键:出租属性
)属性id
- 返回结果数据,作为相应类的实例
工厂方法是这种情况下正确的设计模式吗?如果是,我该如何进行上述工作?如果您已经可以使用左连接生成一个可变平坦树的查询,那么您可以在php端执行类似的操作来创建对象模型。当然,您需要填写一个mo重新定义属性类型,使其真正有用
class Property {
public function setPropertyValuesFromArray($array){
foreach($array as $k=>$v){
$this->$k = $v;
}
}
}
class CommercialProperty extends Property {}
class LettingProperty extends Property {}
class PropertyFactory {
protected $db;
public function __construct(DbConnection $db){
$this->db = $db;
}
public function getPropertyById($id){
$result = $this->db->fetchRow($queryToGetPropertyById);
return $this->getPropertyFromArray($result);
}
public function getPropertyFromArray($result){
switch($result["property_type"]){
case "residential":
$p = new Property();
break;
case "commericial":
$p = new CommercialProperty();
break;
case "letting":
$p = new LettingProperty();
break;
default:
throw new Exception("Unknown Property Type ".$result["property_type"]);
break;
}
$p->setPropertyValueFromArray($result);
return $p;
}
}
看起来数据库的问题比工厂模式的问题要多。那么,您的数据库设计如何?为什么您在使用左连接时遇到问题?@redreggae发出查询时,他不知道要连接到哪个表,因为属性可以是没有连接的原始属性,可以是连接到一个表的LettingProperty,也可以是CommercialProperty这将连接到另一个表。@martinBean可能更简单,只需发出两个查询,一个查询属性,一个查询基于属性类型字段中包含的值的属性子类型。……为了帮助性能缓存,结果可能是一个适当的操作。@martinBean让工厂返回(即Decorator模式)属性可能是一个很好的解决方案。@Orangepill完全正确。我不知道仅基于ID就要连接哪个表(如果有)。如果可能,我宁愿只使用一个数据库查询。我可以
左连接
这些表(如果连接表中不存在数据,它们将返回null)但是我想要一个干净的方法将这个原始的DB结果转换成相关的模型类。