当前位置: 首页 > 后端技术 > PHP

PHP设计模式(五)建造者模式(Builder)

时间:2023-03-29 20:50:15 PHP

什么是建造者设计模式建造者模式:将复杂对象的构造与其表示分离,使得同一个构造过程可以创建设计模式的不同表示。设计场景:有一个用户的UserInfo类。创建这个类需要创建用户的姓名、年龄、兴趣爱好等信息,获取用户的具体信息结果。例如:这是一个用户类:classUserInfo{protected$_userName;受保护的$_userAge;受保护的$_userHobby;publicfunctionsetUserName($userName){$this->_userName=$userName;}publicfunctionsetUserAge($userAge){$this->_userAge=$userAge;}publicfunctionsetUserHobby($userHobby){$this->_userHobby=$userHobby;}publicfunctiongetPeopleInfo(){echo"
Thisperson'snameis:".$this->_userName。“
年龄:”。$this->_userAge。“
爱好:”。$this->_userHobby;}}这时候我们要获取一个用户的信息,流程如下:$modelUser=newUserInfo();$modelUser->setUserName('松涛');$modelUser->setUserAge('23');$modelUser->setUserHobby('推理小说');$modelUser->getPeopleInfo();结果是:人的名字是:松涛年龄:23??爱好:推理小说这时候我们来看builder设计模式的设计:创建一个UserBuilder用户生成器类,这个类会创建一个复杂的UserInfo名字,年龄,对兴趣爱好等操作进行封装,简化用户类的创建过程:这是将复杂的创建过程封装在builderPeople方法中。接下来是创建对象:classUserBuilder{protected$_obj;公共函数__construct(){$this->_obj=newUserInfo();}publicfunctionbuilderPeople($userInfo){$this->_obj->setUserName($userInfo['userName']);$this->_obj->setUserAge($userInfo['userAge']);$this->_obj->setUserHobby($userInfo['userHobby']);}公共函数getBuliderPeopleInfo(){$this->_obj->getPeopleInfo();}}客户端获取数据:$userArr=array('userName'=>'松涛','userAge'=>'23','userHobby'=>'推理小说');$modelUserBuilder=newUserBuilder();$modelUserBuilder->builderPeople($userArr);$modelUserBuilder->getBuliderPeopleInfo();输出结果为:这个人的名字是:松涛年龄:23??爱好:推理小说生成器优缺点优点:生成器模式可以很好地将一个对象的实现和相关的“业务”逻辑分开,这样添加起来就非常容易(或更改)实现而不更改事件逻辑。缺点:builder接口的修改会引起所有实现类的修改。建造者模式应在以下几种情况下使用:1.需要生成的产品对象具有复杂的内部结构。2、需要生成的product对象的属性相互依赖,builder模式可以强制生成顺序。3、系统中的一些其他对象在对象创建过程中会用到,这些对象在产品对象创建过程中不容易获取。根据上面的例子,我们可以得到建造者模式的效果:1.使用建造者模式可以实现产品内部外观的独立改变。使用构建器模式可以使客户不必了解产品内部组成的细节。2、每个Builder都是相对独立的,与其他Builder无关(独立的控制逻辑)。3.图案构建的最终产品更容易控制。建造者模式和工厂模式的区别:我们可以看到建造者模式和工厂模式非常相似。总的来说,建造者模式只比工厂模式多了一个“导演”的角色。在建造者模式的类图中,如果把director类看成是最终调用的client,那么图中剩下的部分就可以看成是一个简单的工厂模式。与工厂模式相比,建造者模式一般用来创建更复杂的对象,因为对象的创建过程更加复杂,所以将对象的创建过程分离出来,形成一个新的类——主管类。也就是说,工厂模式将对象的整个创建过程封装在工厂类中,工厂类将最终产品提供给客户端;而在建造者模式下,建造者类一般只提供产品类中各个组件的构建,而具体的构建过程则交给了主管类。director类负责将各个组件按照特定的规则构建成一个产品,然后将构建好的产品交付给客户端。