PHP设计模式之建造者模式定义与用法简单示例

本文实例讲述了PHP设计模式之建造者模式。分享给大家供大家参考,具体如下:

建造者模式:

将复杂对象的创建过程和表示进行分离(好吧,我也看不懂什么意思1)。

来点我人类能听懂的话:

1、在客户端看来需要的仅仅是实例化后的类对象(大多数情况下是需要类的属性)。

2、传统方式下当类有了之后,一般直接通过new class()的方式直接进行实例化,然后通过$obj->set1()构建属性1,$obj->set2()构建属性2,$obj->set3()构建属性3。。。

3、传统方式有一个很大的弊端:当我们的类发生改变后,我们需要大量的修改,比如文件1中加上$obj->set4(),文件2中加上$obj->set4(),增加很多的工作量。

4、建造者模式会给出构建对象的具体实现类,将对象的创建实例化过程封装在建造者类中,并给出一个返回构建后对象的方法,将构建后的对象返回。

5、当类发生改变后,只需要改变建造者类中构建对象的build()方法,对客户端来说,这并不可见,并且不用做修改就得到了修改后的对象。改动的只是需求对象修改后的逻辑处理。

  1. /**
  2. * 产品类Person
  3. */
  4. class Person
  5. {
  6. public $_head;
  7. public $_body;
  8. public function setHead($head){
  9. $this->_head=$head;
  10. }
  11. public function getHead(){
  12. echo $this->_head;
  13. }
  14. public function setBody($body){
  15. $this->_body=$body;
  16. }
  17. public function getBody(){
  18. echo $this->_body;
  19. }
  20. }
  21. /*
  22. 抽象建造者:
  23. 定义的一个抽象接口,用于对具体建造者类进行规范
  24. */
  25. interface Builder{
  26. public function buildHead();
  27. public function buildBody();
  28. public function getResult();
  29. }
  30. /*
  31. 具体建造者:
  32. 用于实现具体建造者类
  33. */
  34. class ConcreteBuilder implements Builder{
  35. public $person;
  36. public $data;
  37. public function __construct($data){
  38. $this->person=new Person();
  39. $this->data=$data;
  40. }
  41. public function buildHead(){
  42. $this->person->setHead($this->data['head']);
  43. }
  44. public function buildBody(){
  45. $this->person->setBody($this->data['body']);
  46. }
  47. public function getResult(){
  48. return $this->person;
  49. }
  50. }
  51. /*
  52. 导演者类:
  53. 用于调用具体建造者类创建产品类实例
  54. */
  55. class Director{
  56. public function __construct(ConcreteBuilder $builder){
  57. $builder->buildHead();
  58. $builder->buildBody();
  59. }
  60. }
  61. /*
  62. 客户端:
  63. 根据需求进行逻辑处理
  64. */
  65. $data=array(
  66. 'head'=>'大头儿子',
  67. 'body'=>'身体棒棒哒'
  68. );
  69. $builder=new ConcreteBuilder($data);
  70. $director=new Director($builder);
  71. $person=$builder->getResult();
  72. echo $person->_head;
  73. echo $person->_body;

运行结果:

大头儿子身体棒棒哒