[关闭]
@Chiang 2019-12-12T13:37:20.000000Z 字数 3833 阅读 572

建造者模式

设计模式


  • 抽象建造者 (interface) 接口
  • 具体建造者
  • 导演者
  • 产品角色

模式定义

造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式

代码结构

建造者模式UML

实现原理

1.定义抽象建造者

  1. <?php
  2. /**
  3. * 抽象建造者(Builder)角色
  4. *
  5. * @author Luffy (lufei@swoole.com)
  6. * @date 2019/9/23
  7. * @copyright Swoole, Inc.
  8. * @package sy-records/design-patterns
  9. */
  10. namespace Luffy\DesignPatterns\Builder;
  11. interface Builder
  12. {
  13. // public function createCar();
  14. //创建部件A 比如创建汽车发动机
  15. public function buildPartA();
  16. //创建部件B 比如创建汽车底盘
  17. public function buildPartB();
  18. //创建部件C 比如创建汽车变速箱
  19. public function buildPartC();
  20. // 其他的一些零件
  21. public function buildOthers();
  22. /**
  23. * 返回最后组装成品结果 (返回最后装配好的汽车),
  24. * 成品的组装过程不在这里进行,而是转移到下面的Director类中进行,
  25. * 从而实现了解耦过程和部件。
  26. * return Product
  27. */
  28. public function getCar();
  29. }

2.创建产品角色

  1. <?php
  2. /**
  3. * 产品(Product)角色
  4. *
  5. * @author Luffy (lufei@swoole.com)
  6. * @date 2019/9/23
  7. * @copyright Swoole, Inc.
  8. * @package sy-records/design-patterns
  9. */
  10. namespace Luffy\DesignPatterns\Builder;
  11. class Car
  12. {
  13. /**
  14. * @var array
  15. */
  16. protected $_parts = [];
  17. public function setPartA()
  18. {
  19. $this->_parts[] = "发动机、";
  20. return $this;
  21. }
  22. public function setPartB()
  23. {
  24. $this->_parts[] = "底盘、";
  25. return $this;
  26. }
  27. public function setPartC()
  28. {
  29. $this->_parts[] = "变速箱、";
  30. return $this;
  31. }
  32. public function setOthers()
  33. {
  34. $this->_parts[] ="其他零件";
  35. return $this;
  36. }
  37. public function getCar()
  38. {
  39. $str = "这辆车由:";
  40. foreach ($this->_parts as $item) {
  41. $str .= $item;
  42. }
  43. $str .= "组成\n";
  44. echo $str;
  45. }
  46. }

3.实现具体建造者

  1. <?php
  2. /**
  3. * 具体建造者(CarBuilder)角色
  4. *
  5. * @author Luffy (lufei@swoole.com)
  6. * @date 2019/9/23
  7. * @copyright Swoole, Inc.
  8. * @package sy-records/design-patterns
  9. */
  10. namespace Luffy\DesignPatterns\Builder;
  11. class CarBuilder implements Builder
  12. {
  13. protected $car;
  14. public function __construct()
  15. {
  16. $this->car = new Car();
  17. }
  18. public function buildPartA()
  19. {
  20. $this->car->setPartA();
  21. }
  22. public function buildPartB()
  23. {
  24. $this->car->setPartB();
  25. }
  26. public function buildPartC()
  27. {
  28. $this->car->setPartC();
  29. }
  30. public function buildOthers()
  31. {
  32. $this->car->setOthers();
  33. }
  34. public function getCar()
  35. {
  36. return $this->car;
  37. }
  38. }

4.创建导演者

  1. <?php
  2. /**
  3. * 导演者(Director)角色
  4. *
  5. * @author Luffy (lufei@swoole.com)
  6. * @date 2019/9/23
  7. * @copyright Swoole, Inc.
  8. * @package sy-records/design-patterns
  9. */
  10. namespace Luffy\DesignPatterns\Builder;
  11. class Director
  12. {
  13. private $builder;
  14. public function __construct(Builder $builder)
  15. {
  16. $this->builder = $builder;
  17. }
  18. public function build()
  19. {
  20. $this->builder->buildPartA();
  21. $this->builder->buildPartB();
  22. $this->builder->buildPartC();
  23. $this->builder->buildOthers();
  24. return $this->builder->getCar();
  25. }
  26. }

5.客户端的通过导演者获取具体产品角色

  1. <?php
  2. /**
  3. * 建造者客户端测试文件
  4. *
  5. * @author Luffy (lufei@swoole.com)
  6. * @date 2019/9/23
  7. * @copyright Swoole, Inc.
  8. * @package sy-records/design-patterns
  9. */
  10. use Luffy\DesignPatterns\Builder\CarBuilder;
  11. use Luffy\DesignPatterns\Builder\Director;
  12. use Luffy\DesignPatterns\Builder\Car;
  13. include __DIR__ . '/../vendor/autoload.php';
  14. class Client
  15. {
  16. public static function index()
  17. {
  18. $carBuilder = new CarBuilder();
  19. $director = new Director($carBuilder);
  20. $newCar = $director->build();
  21. $newCar->getCar();
  22. }
  23. }
  24. // 使用建造者
  25. Client::index();

流式操作

  1. <?php
  2. /**
  3. * 产品(Product)角色
  4. *
  5. * @author Luffy (lufei@swoole.com)
  6. * @date 2019/9/23
  7. * @copyright Swoole, Inc.
  8. * @package sy-records/design-patterns
  9. */
  10. namespace Luffy\DesignPatterns\Builder;
  11. class Car
  12. {
  13. /**
  14. * @var array
  15. */
  16. protected $_parts = [];
  17. public function setPartA()
  18. {
  19. $this->_parts[] = "发动机、";
  20. return $this;
  21. }
  22. public function setPartB()
  23. {
  24. $this->_parts[] = "底盘、";
  25. return $this;
  26. }
  27. public function setPartC()
  28. {
  29. $this->_parts[] = "变速箱、";
  30. return $this;
  31. }
  32. public function setOthers()
  33. {
  34. $this->_parts[] ="其他零件";
  35. return $this;
  36. }
  37. public function getCar()
  38. {
  39. $str = "这辆车由:";
  40. foreach ($this->_parts as $item) {
  41. $str .= $item;
  42. }
  43. $str .= "组成\n";
  44. echo $str;
  45. }
  46. }
  1. <?php
  2. /**
  3. * 建造者客户端测试文件
  4. *
  5. * @author Luffy (lufei@swoole.com)
  6. * @date 2019/9/23
  7. * @copyright Swoole, Inc.
  8. * @package sy-records/design-patterns
  9. */
  10. use Luffy\DesignPatterns\Builder\CarBuilder;
  11. use Luffy\DesignPatterns\Builder\Director;
  12. use Luffy\DesignPatterns\Builder\Car;
  13. include __DIR__ . '/../vendor/autoload.php';
  14. class Client
  15. {
  16. public static function test()
  17. {
  18. $car = new Car();
  19. $car->setPartA()
  20. ->setPartB()
  21. ->setPartC()
  22. ->setOthers()
  23. ->getCar();
  24. }
  25. }
  26. // 流式操作
  27. Client::test();

参考资料:
swoole微课堂
GitHub
Graphic Design Patterns

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注