当前位置:
文档之家› 设计模式实验报告-建造者模式
设计模式实验报告-建造者模式
建造者模式
建造者
建造者设计模式定义了处理其他对象的复杂构建的对象设计。
问题:创建复杂对象时候,构造函数的创建会涉及通用体系结构判定。某些编程人员认为任何构造函数都应当执行适当的逻辑以创建整个对象。另外一些编程人员则认识到将某些逻辑分解入其他方法才是有意义的。采用后一种样式设计的构造函数基本上是一系列请求实例化的方法。上述两种解决方案都不是特别灵活。事实上,它们根本就是错误的解决方案。
}
public functiongetProduct()
{
return $this->_product;
}
}
$productConfigs=array('type'=>'shirt','size'=>'XL','color'=>'red');
/*Build()方法隐藏了来自请求新product对象的代码的实际方法调用。如果product类以后发生改变,那么只需要修改productBuilder类的buildtType($productConfigs['size']);
$product->setType($productConfigs['color']);
*/
/*创建对象时分别调用每个方法并不是最佳的做法。此时,最好使用基于建造者设计魔术的对象来创建这个产品实例。
productBuilder类被设计为接受构建product对象所需的这些配置选项。它不仅存储配置参数,而且存储一个实例化的新product实例。builder()方法负责调用product类中的所以方法,从而构建完整的product对象。最后,getProduct()方法返回完整构建的product对象*/
}
}
//为了创建完整的产品对象,需要将产品配置分别传递给产品类的每个方法:
/*
$productConfigs=array('type'=>'shirt','size'=>'XL','color'=>'red');
$product=new product();
$product->setType($productConfigs['type']);
解决方案:我们可以基于一组业务逻辑的结果来构造对象。在示例中,对象只有特定的部分必须被创建。如果完全定义对象的所有部分,那么可能导致完全预见不能的结果。
多个方法调用的复杂性问题在使用之处似乎并非太严重,但该复杂性却是缓慢增长的。如果需要经常调用这些方法,那么就应当创建一个Builder对象。
UML
MyObject MyObjectBuilder
class productBuilder
{
protected $_product=NULL;
protected $_configs=array();
public function __construct($configs)
{
$this->_product=new product();
$this->_xml=$configs;
-MyObject:MyObect
+complexFunctionA() +createInstanceOfMyObject()
+complexFunctionB() +buideMyObject(configurationOptions)
+getBuiltMyObject()
*MyObject类具有能够完全实现对象构造的两个方法。为了具有完整的Myobject对象,需要执行complexFunctionA()和complexFunctionB()方法。
}
public function build()
{
$this->_product->setType($this->_xml['type']);
$this->_product->setSize($this->_xml['size']);
$this->_product->setColor($this->_xml['color']);
$builder=new productBuilder($productConfigs);
$builder->build();
$product=$builder->getProduct();
var_dump($product);
?>
结果如下图:
心得:建造者设计模式的目的是消除其他对象的复杂创建过程。使用建造者设计模式不仅是最佳的做法,而且在某个对象的构建和配置方法改变时可以尽可能地减少重复更改代码。
*MyObjectBuilder类包含一个名为createInstanceOfMyObject()的方法。这个类负责创建Myobject类的一个简单实例。需要注意没有用于进一步构造的配置选项。这个类还存储MyObjectBuilder类创建的实例中的私有实例。
*buildMyObject()方法接受参数configurationOption。这个方法用于调用在MyObjectBuilder对象中存储的MyObject对象的complexFunctionA()和complexFunctionB()方法。
public function setType($type)
{
$this->_type=$type;
}
public function setSize($size)
{
$this->_size=$size;
}
public function setColor($color)
{
$this->_color=$color;
*getBuildObject()方法返回MyObjectBuilder对象内部Myobject对象的私有实例,该实例既是完整的,也是正常构建的。
示例代码演示:
<?php
class product
{
protected $_type='';
protected $_size='';
protected $_color='';