实例化对象列表的正确方法

时间:2012-01-25 10:12:48

标签: php oop design-patterns

我一直想知道我应该如何编写,以及使用哪种设计模式来创建对象列表。

首先,考虑我有一个Customer类和一个Order类。 我想获得属于用户的所有订单。

我想要$ oCustomer-> getOrders();返回Order对象数组。

基本上,我一直在想:

OrderManager类,它是一个单例,能够从存储引擎检索Order数据并构建Order对象。但我一直在阅读这是一个不好的做法,所以这似乎不是一个好主意。

在Order类中使用静态方法,例如getOrders(args),但我不确定这是静态方法的真正意义。

使用工厂(我从未使用过,遗憾地)处理对象创建(我可能需要一些例子)

在instanciated Order对象中使用方法。这似乎是世界上最糟糕的选择,因为我真的不认为对象应该能够返回自己的集合。

这看起来像是一项非常基本的任务,我猜它是。但我无法找到任何人以“适当”的方式这样做。 我可以添加其他类等(例如DataMappers,Gateways,aso ...来处理检索和映射)但我真的不想在我的商务逻辑中与这些类进行对话。

提前致谢。

2 个答案:

答案 0 :(得分:2)

查看Lazy Load pattern from POEAA

Lazy Load pattern from POEAA

请注意,该图表不建议将逻辑放在从数据库中获取订单到Customer对象中。相反,该模式表明:

  

懒惰载荷主要有四种。 延迟初始化使用特殊标记值(通常为null)来指示未加载字段。对字段的每次访问都会检查字段中的标记值,如果已卸载,则加载它。 虚拟代理是一个与真实对象具有相同接口的对象。第一次调用其中一个方法时,它会加载真实的对象然后委托。 值持有者是具有getValue方法的对象。客户端调用getValue来获取真实对象,第一个调用触发负载。 ghost 是没有任何数据的真实对象。第一次调用方法时,ghost会将完整数据加载到其字段中。

有关其他模式,请考虑Repository并查看Data Source Architectural Patterns。通常,当您有很多对象 - 关系行为问题时,请考虑使用ORM,如Doctrine2。

答案 1 :(得分:0)

您可以使用一个表示与数据库连接的类,一个使用此数据访问对象的数据访问对象和一个表示实际对象的类。

http://en.wikipedia.org/wiki/Data_access_object