Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 协助工厂模式的实施_Php_Design Patterns_Factory_Factory Pattern - Fatal编程技术网

Php 协助工厂模式的实施

Php 协助工厂模式的实施,php,design-patterns,factory,factory-pattern,Php,Design Patterns,Factory,Factory Pattern,我已经将这个问题标记为PHP,但更多的是关于设计模式的问题,即工厂模式;PHP就是我正在使用的编程语言 我正在建立一个房地产代理网站(美国表亲的“房地产”)。我有一个Property类,但是其他类扩展了这个类,例如LettingProperty,CommercialProperty,它具有特定于该类型属性的字段 在我的控制器中,我想显示一个特定的属性。这很容易,因为我将属性ID作为参数传递。我的方法是创建一个工厂类,该类将属性作为相关类的实例返回。例如,如果ID为1的属性是出租属性,则返回Let

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

我正在建立一个房地产代理网站(美国表亲的“房地产”)。我有一个
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结果转换成相关的模型类。