到目前为止,我一直在处理的大多数对象看起来非常像它们所基于的数据库表。所以我有一个fish对象映射db.fish表和fish_transfer对象,它映射db.fish_transfer表等。
现在我正在开发一个类Provenance
来管理不容易映射到单个数据库表的数据。情况如下:
每条鱼都有出处,即有关它进入我们系统之前的位置的信息。有4种出处:“未知”,“已交付”,“现场培育”,“重复使用”。所有种源都有一个fish_id和一个相关的日期,除了“现场培育”之外的所有种类都要求立即计数。除此之外,它们与它们相关的数据以及在创建/删除或更改时必须采取的行动是完全不同的。
我曾想过将鱼源物种存放在鱼类物体中。因此,在实例化时,fish会调用ProvenanceFactory::make($this->fish_id, $this->ptype)
并获取正确子类的起源对象$prov
。那么如果编辑出处类型会发生什么呢?
的可能性:
$this->prov->delete()
,然后致电$this->prov=ProvenanceFactory::make($this->fish_id, $newtype); $this->prov->setall($data);
ProvenanceFactory::morph(&$this->prov,$newtype); $this->prov->setall($data);
$this->prov->morph($newtype); $this->prov->setall($data);
$this->prov->morph($newtype, $data)
; 在所有情况下,编辑起源类型会导致更新或删除特定于Provenance
子类的各种表中的一组数据库行,然后在各种其他表中创建另一组行。
上述哪种可能性(或其他)是最好的方法?我应该尝试实施哪些设计模式(工厂除外)?
答案 0 :(得分:1)
如何拥有一个ProvenanceBase
类,它有一个复制构造函数
这样,你的工厂可以有一个变形方法(类似于你写的第二个子弹),它只是从现有的派生的对象中创建一个新的派生的对象。
答案 1 :(得分:0)
我不想建议重新映射您所做的一切,但是您是否考虑过使用类表继承。
请参阅:http://martinfowler.com/eaaCatalog/classTableInheritance.html
因此,在您的示例中,您的Provenance
表格可以使用您的discrimator coloumn来确定该类所处的状态。