我一直想知道我应该如何编写,以及使用哪种设计模式来创建对象列表。
首先,考虑我有一个Customer类和一个Order类。 我想获得属于用户的所有订单。
我想要$ oCustomer-> getOrders();返回Order对象数组。
基本上,我一直在想:
OrderManager类,它是一个单例,能够从存储引擎检索Order数据并构建Order对象。但我一直在阅读这是一个不好的做法,所以这似乎不是一个好主意。
在Order类中使用静态方法,例如getOrders(args),但我不确定这是静态方法的真正意义。
使用工厂(我从未使用过,遗憾地)处理对象创建(我可能需要一些例子)
在instanciated Order对象中使用方法。这似乎是世界上最糟糕的选择,因为我真的不认为对象应该能够返回自己的集合。
这看起来像是一项非常基本的任务,我猜它是。但我无法找到任何人以“适当”的方式这样做。 我可以添加其他类等(例如DataMappers,Gateways,aso ...来处理检索和映射)但我真的不想在我的商务逻辑中与这些类进行对话。
提前致谢。
答案 0 :(得分:2)
查看Lazy Load pattern from POEAA:
请注意,该图表不建议将逻辑放在从数据库中获取订单到Customer对象中。相反,该模式表明:
懒惰载荷主要有四种。 延迟初始化使用特殊标记值(通常为null)来指示未加载字段。对字段的每次访问都会检查字段中的标记值,如果已卸载,则加载它。 虚拟代理是一个与真实对象具有相同接口的对象。第一次调用其中一个方法时,它会加载真实的对象然后委托。 值持有者是具有getValue方法的对象。客户端调用getValue来获取真实对象,第一个调用触发负载。 ghost 是没有任何数据的真实对象。第一次调用方法时,ghost会将完整数据加载到其字段中。
有关其他模式,请考虑Repository并查看Data Source Architectural Patterns。通常,当您有很多对象 - 关系行为问题时,请考虑使用ORM,如Doctrine2。
答案 1 :(得分:0)
您可以使用一个表示与数据库连接的类,一个使用此数据访问对象的数据访问对象和一个表示实际对象的类。