我已经在PHP上标记了这个问题,但它更多的是关于设计模式的问题,即工厂模式; PHP只是我正在使用的编程语言。
我正在建立房地产经纪人(美国堂兄弟的“房地产”)网站。我有一个Property
类,但其他类扩展了这个类,即LettingProperty
,CommercialProperty
,其中包含特定于该类型属性的字段。
在我的控制器中,我想显示一个特定的属性。这很简单,因为我将属性ID作为参数传递。我的方法是创建一个工厂类,将属性作为相关类的实例返回。例如,如果ID为1的属性是letting属性,则返回LettingProperty
的实例。如果它只是标准的“待售”属性,则为Property
。
我该如何解决这个问题?我创建了一个PropertyFactory
类并实现了一个名为buildFromId()
的方法,但是无法创建一个优雅的解决方案:
properties
数据库表LEFT JOIN
s(即如果它是一个letting属性,请加入来自letting_properties
的相关数据(外键:property_id
)工厂是否接近这种情况的正确设计模式?如果是这样,我怎么能解决上述问题?
答案 0 :(得分:0)
如果您已经可以使用左连接生成一个可变地展平树的查询,那么您可以在php端执行类似的操作来创建对象模型。当然,您希望在属性类型上更多地填写实现,以使它们真正有用。
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;
}
}