螃蟹学PHP设计模式之建造者模式

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设计模式之建造者模式,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。