23种设计模式-建造者模式


23种设计模式-建造者模式

概述

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示

  • 分离了部件的构造和装配。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况
  • 由于实现了构建和装配的解耦。不同的构建器、相同的装配,也可以做出不同的对象;想通的构建器、不同的装配顺序也可以做出不同的对象,也就是实现了构建算法、装配算法的解耦,实现了更好的复用
  • 建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无需知道其内部的具体构造细节

结构

建造者模式包含如下角色:

  • 抽象建造者类(Builder):这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建
  • 具体建造者类(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例
  • 产品类(Product):要创建的复杂对象
  • 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指挥者中不涉及具体产品的信息,只保证对象各个部分完整创建或按某种顺序创建

实现

/**
 * 抽象建造者
 */
abstract class MobileBuilder
{
    protected $mobile;
    abstract public function setName();
    abstract public function setDate();
    abstract public function createMobile();
    abstract public function getMobile();
}

/**
 * 抽象产品
 */
interface Mobile
{
    public function setName($name);
    public function getName();
    public function setDate($date);
    public function getDate();
}

/**
 * 具体产品
 */
class RedmiK70 implements Mobile
{
    protected $name;
    protected $date;

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
       return $this->name;
    }

    public function setDate($date)
    {
        $this->date = $date;
    }

    public function getDate()
    {
        return $this->date;
    }
}

/**
 * 具体产品
 */
class HuaweiNova12 implements Mobile
{
    protected $name;
    protected $date;

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
       return $this->name;
    }

    public function setDate($date)
    {
        $this->date = $date;
    }

    public function getDate()
    {
        return $this->date;
    }
}

/**
 * 具体建造者
 * 红米产品
 */
class Redmi extends MobileBuilder
{

    public function setName()
    {
        // 设置手机名称
        $this->mobile->setName('红米K70');
        return $this;
    }

    public function setDate()
    {
        $this->mobile->setDate('2023');
        return $this;
    }

    public function createMobile()
    {
        $this->mobile = new RedmiK70();
        return $this;
    }

    public function getMobile():Mobile
    {
        return $this->mobile;
    }
}

/**
 * 具体建造者
 * 华为产品
 */
class Huawei extends MobileBuilder
{

    public function setName()
    {
        // 设置手机名称
        $this->mobile->setName('华为Nova12');
        return $this;
    }

    public function setDate()
    {
        $this->mobile->setDate('2023');
        return $this;
    }

    public function createMobile()
    {
        $this->mobile = new HuaweiNova12();
        return $this;
    }

    public function getMobile():Mobile
    {
        return $this->mobile;
    }
}

/**
 * 指挥者
 */
class Director
{
    public function build(MobileBuilder $build)
    {
        $build->createMobile();
        $build->setName();
        $build->setDate();
        return $build->getMobile();
    }
}

文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
23种设计模式-代理模式 23种设计模式-代理模式
23种设计模式-代理模式概述由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 结构代理模式分为三种角色: 抽象主题类:通过接口或抽象类声明真实
下一篇 
23种设计模式-原型模式 23种设计模式-原型模式
23种设计模式-原型模式概述用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象 结构原型模式包含如下角色: 抽象原型类:规定了具体原型对象必须实现的clone方法 具体原型类:实现抽象原型类的clone方法,
  目录