php – 这是一个很好的工厂候选人吗?
我想创建一个投票系统,可以对多个域对象进行投票:
>日历活动 所以我想我会为这些项目创建一个Voteable接口: interface Voteable { public function vote( User $user,$value ); } 我认为这个投票方法会代理存储库方法,例如: class VotingRepository { public function castVote( Voteable $item,User $user,$value ) { // save the these values,along with the value $itemId = $item->getId(); $userId = $user->getId(); } } 目前,存储库将是一个数据库.该数据库将为每种类型的投票提供链接表: > eventVote 因此,这实质上意味着每个域对象都需要另一个表来投票.这对工厂来说是个好人吗?这种情况下的VotingRepositoryFactory?换句话说,像: class VotingRepositoryFactory { createVotingRepository( $type ) { switch( $type ) { case 'event': // create a voting repository with EventVote table return new VotingRepository( new EventVoteTable() ); case 'comment': // create a voting repository with CommentVote table return new VotingRepository( new CommentVoteTable() ); case 'user': // create a voting repository with UserVote table return new VotingRepository( new UserVoteTable() ); } } } 然后,从域对象(例如在这种情况下评论)中将它们全部捆绑在一起,我看起来像这样: class Comment implements Voteable { public function construct() { $this->_repository = VotingRepositoryFactory::createVotingRepository( 'comment' ); } public function vote( User $user,$value ) { $this->_repository->castVote( $this,$user,$value ); } } 这有意义吗?
是的,存储库和工厂都有意义.
关于工厂的一些评论: 我将删除开关($type)并为每种类型的Votable对象创建方法.而不是 VotingRepositoryFactory :: createVotingRepository(‘comment’); 我更喜欢 VotingRepositoryFactory :: createCommentVotingRepository(); 原因是很容易忘记在交换机上添加一个新案例,而(我不确定php,但是)编译语言会告诉你何时缺少一个被调用的方法.还记得你可以发送到工厂方法的字符串,因为$type很难,而大多数智能IDE会告诉你类/对象上有什么方法. 另一个想法是添加一个可以调用的单例,如VotingRepositoryFactory :: Instance-> createCommentVotingRepository();.然后,“Instance”可以是DatabaseVotingRepositoryFactory或FakeVotingRepositoryFactory(用于单元测试)或VotingRepositoryFactory的任何其他实现.这样,如果要编写单元测试或切换到其他存储系统,就可以轻松替换VotingRepositoryFactory的实现. 只是一些想法.. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |