协助工厂模式实施

时间:2013-07-15 16:43:00

标签: php design-patterns factory factory-pattern

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

我正在建立房地产经纪人(美国堂兄弟的“房地产”)网站。我有一个Property类,但其他类扩展了这个类,即LettingPropertyCommercialProperty,其中包含特定于该类型属性的字段。

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

的实例

我该如何解决这个问题?我创建了一个PropertyFactory类并实现了一个名为buildFromId()的方法,但是无法创建一个优雅的解决方案:

  • 在我的properties数据库表
  • 中查找相关记录
  • 是否有任何LEFT JOIN s(即如果它是一个letting属性,请加入来自letting_properties的相关数据(外键:property_id
  • 返回结果数据,作为相应类
  • 的实例

工厂是否接近这种情况的正确设计模式?如果是这样,我怎么能解决上述问题?

1 个答案:

答案 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;
    }
 }