建造者模式(Builder Pattern)

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

介绍

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例:1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。

优点:1、建造者独立,易扩展。 2、便于控制细节风险。

缺点:1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景:1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

<?php

/**
* 建造者模式特点:
*    1.客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
*    2.每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 
*    3.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式
*
*角色:
*    Product(产品角色):一个具体的产品对象。 
*    Builder(抽象建造者):创建一个Product对象的各个部件指定的抽象接口。 
*    ConcreteBuilder(具体建造者):实现抽象接口,构建和装配各个部件。 
*    Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,
*                        二是:负责控制产品对象的生产过程。
*
*示例:
*    通过建造者模式来创建不同配置的手机,用户购买手机时不需要知道手机是怎么生产出来的只要说自己要低配手机(低配建造者)还是高配手机(高配建造者)然后手机商(指挥者)去获取
*
*/


class Phone{
    public $ram;
    public $rom;
}

abstract class Builder{
    protected $phone;
    public function __construct(){
        $this->phone = new Phone;
    }
    public abstract function addRom();
    public abstract function addRam();
    public function getResult(){
        return $this->phone;
    }
}

class LowBuilder extends Builder{
    public function addRom(){
        $this->phone->rom = "4G";
    }

    public function addRam(){
        $this->phone->ram = "3G";
    }
}

class HightBuilder extends Builder{
    public function addRom(){
        $this->phone->rom = "6G";
    }

    public function addRam(){
        $this->phone->ram = "4G";
    }
}

class Shoper{
    public function __construct(Builder $builder){
        $builder->addRom();
        $builder->addRam();
    }
}

$builder = new HightBuilder();
new Shoper($builder);
var_dump($builder);
posted @ 2020-03-01 21:38  笨笨韩  阅读(273)  评论(0)    收藏  举报