1

我已经标记了这个问题PHP,但它更多的是关于设计模式的问题,即工厂模式;PHP 只是我正在使用的编程语言。

我正在建立一个房地产经纪人(美国表亲的“房地产”)网站。我有一个Property类,但其他类扩展了它,即LettingProperty具有CommercialProperty特定于该类型属性的字段。

在我的控制器中,我想显示一个特定的属性。这很容易,因为我将属性 ID 作为参数传递。我的方法是创建一个工厂类,将属性作为相关类的实例返回。例如,如果 ID 为 1 的属性是出租属性,则返回 的实例LettingProperty。如果它只是一个标准的“待售”属性,则为Property.

我该怎么办?我创建了一个PropertyFactory类并实现了一个名为 的方法buildFromId(),但是在创建一个优雅的解决方案时遇到了麻烦:

  • properties在我的数据库表中找到相关记录
  • 做任何LEFT JOINs (即如果它是一个让属性离开加入相关数据letting_properties(外键property_id:)
  • 返回结果数据,作为相应类的实例

对于这种情况,工厂方法是正确的设计模式吗?如果是这样,我该怎么做?

4

1 回答 1

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;
    }
 }
于 2013-07-15T18:45:50.383 回答