2.建造者模式
螃蟹今天要学习建造者模式了,昨天的适配器记得还是很清楚的。对于建造者模式,螃蟹的理解是你有10部iphone手机要充电,假设充电器额定电压都是220v,但是外电压不稳定,可能是220v,也可能是240v,或是300v,这个时候怎么办,可行的方法是购置一个家用变压器,把充电器都连在变压器上,不需要直接连在外电网上,无论外电压如何变化,只需要操作变压器即可。这个比喻可能有些牵强,不过还是能够说明建造者模式的用途,就是原对象可能是可变的,包括接收的参数或是方法等,但是如果我们已经在程序中大量实例化了原对象,这后面就很不利于维护了,这个时候那就最好创建一个建造者对象来完成原对象的实例化,避免直接对原对象的操作,这样后续原对象改动时,只需要改变建造者对象类即可。
参考项目模块:会员系统
会员系统出现频率还是挺高的,之前也遇到过项目,会员原对象开始定义的比较简介,螃蟹也做的很快,后来可爱的客户说要添加属性,但是项目中到处都使用了原对象,改起来也是挺麻烦,那么如果使用建造者模式则可以比较方便的进行更改了。
原来的用户对象: User.class.php
<?php class User{ private $username = null; private $password = null; /** * @return the $username */ public function getUsername() { return $this->username; } /** * @return the $password */ public function getPassword() { return $this->password; } /** * @param NULL $username */ public function setUsername($username) { $this->username = $username; } /** * @param NULL $password */ public function setPassword($password) { $this->password = $password; } } ?>
那直接实例化原对象进行操作螃蟹就不演示了,这里螃蟹创建一个中间类即建造者类来做实例化原对象的工作: UserBuilder.class.php
<?php require(‘User.class.php‘); class UserBuilder{ protected $_user = null; protected $_datas = array(); function __construct($datas){ $this->_user = new User(); $this->_datas = $datas; } public function build(){ $this->_user->setUsername($this->_datas[‘username‘]); $this->_user->setPassword($this->_datas[‘password‘]); } public function getUser(){ return $this->_user; } } ?>
然后再编写测试文件:TestBuilder.php
<?php require(‘UserBuilder.class.php‘); //模拟用户数据 $user = array(‘username‘=>‘螃蟹‘,‘password‘=>‘px123456‘); //通过建造者类创建对象 $build = new UserBuilder($user); $build->build(); //获取用户对象 $userobj = $build->getUser(); //打印用户对象 echo ‘Username: ‘.$userobj->getUsername(); echo ‘<br>Password: ‘.$userobj->getPassword(); ?>
输出测试结果:
Username: 螃蟹 Password: px123456
螃蟹发现建造者模式和适配器模式还是有相似之处的,适配器模式是原对象不能改,但又需要新增或修改属性或方法,而建造者是原对象不确定,不能直接使用原对象,需要用建造者去build一下,这样两个设计模式大致梳理清楚了,今天就到这里了,螃蟹要做饭去了,快饿扁了。
螃蟹学PHP设计模式之建造者模式,布布扣,bubuko.com
原文地址:http://my.oschina.net/caroltc/blog/297586