🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
https://my.oschina.net/botkenni/blog/1603660 建造者模式主要在于创建一些复杂的对象。将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式; 以下情况应当使用建造者模式: 1、 需要生成的产品对象有复杂的内部结构。 2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。 3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。 根据以上例子,我们可以得到建造者模式的效果: 1、 建造者模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。 2、 每一个Builder都相对独立,而与其它的Builder(独立控制逻辑)无关。 3、 模式所建造的最终产品更易于控制。 建造者模式与工厂模式的区别: 我们可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。 与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。 ``` <?php class Product { //parts部件 private $_parts; public function __construct() { $this->_parts = array(); } public function add($part) { return array_push($this->_parts, $part); } } /** *建造者抽象类 * */ abstract class Builder { public abstract function buidPart1(); public abstract function buidPart2(); public abstract function getResult(); } /** *建造者实现 * */ class ConcreteBuilder extends Builder { private $_product; public function __construct() { $this->_product = new Product(); } public function buidPart1() { $this->_product->add("Part1"); } public function buidPart2() { $this->_product->add("Part2"); } public function getResult() { return $this->_product; } } /** *导演者 * */ class Director { public function __construct(Builder $builder) { $builder->buidPart1(); $builder->buidPart2(); } } $buidler = new ConcreteBuilder(); $director = new Director($buidler); $product = $buidler->getResult(); var_dump($product); echo "<pre>"; ```