设计模式之(五)建造者模式

建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,也是一种创建型模式
设计模式之(五)建造者模式_第1张图片
设计模式之(五)建造者模式_第2张图片
建造者模式包含了以下四个部分。

(1)Builder(抽象建造者)它为建造一个产品Product对象各个部件指定抽象接口,在该接口中一般声明两类方法

  1. buildPartX用于构建复杂对象的各个部件(复杂对象就是包含多个成员变量,这些成员变量也成为零件或者部件,比如汽车包括方向盘,发动机,轮胎等)
  2. getResult 用于返回复杂对象,Builder可以是抽象类,也可以是接口
    (2)ConcreteBuilder(具体构造者)它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确其所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
    (3)Product(产品角色)被构建的对象,包含多个组成部分,具体构造者创建该产品的内部表示并定义其装配过程。
    (4)Director(指挥者)被称为导演类,负责安排复杂对象的建造顺序,指挥者与抽象建造者是关联关系,在construct方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。
    设计模式之(五)建造者模式_第3张图片
    设计模式之(五)建造者模式_第4张图片
    设计模式之(五)建造者模式_第5张图片

完美解决方案

设计模式之(五)建造者模式_第6张图片

package com.learn.designmode.mode.builder;


import lombok.Data;

/** 角色类,复杂产品
 * @author zlx
 */
@Data
public class Actor {
     
    private String type;
    private String sex;
    private String name;
}

package com.learn.designmode.mode.builder;

/** 导演类,针对抽象构造者编程
 * @author Administrator
 */
public class ActorController {
     
    public Actor construct(BaseBuilder baseBuilder){
     
        Actor actor;
        baseBuilder.builderName();
        baseBuilder.builderSex();
        baseBuilder.builderType();
        actor = baseBuilder.getResult();
        return actor;
    }
}

package com.learn.designmode.mode.builder;

import com.learn.designmode.mode.builder.Actor;

/** 创建一个抽象建造者
 * @author zlx
 */
public abstract class BaseBuilder {
     
    protected Actor actor = new Actor();

    public abstract void builderType();

    public abstract void builderSex();

    public abstract void builderName();

    // 工厂返回,返回一个完整的游戏对象
    public Actor getResult(){
     
        return actor;
    }
}

package com.learn.designmode.mode.builder;

// 恶魔构造者
public class DevilBuilder extends BaseBuilder{
     

    @Override
    public void builderType() {
     
        actor.setType("恶魔");
    }

    @Override
    public void builderSex() {
     
        actor.setSex("男");
    }

    @Override
    public void builderName() {
     
        actor.setName("kkkk");
    }
}

package com.learn.designmode.mode.builder;



/** zlx
 * @author Administrator
 */
// 具体构造者
public class HeroBuilder extends BaseBuilder{
     
    @Override
    public void builderType() {
     
        actor.setType("英雄");
    }

    @Override
    public void builderSex() {
     
        actor.setSex("女");
    }

    @Override
    public void builderName() {
     
        actor.setName("zlx");
    }
}


关于director的进一步讨论

上述所提到Director的两个作用

  1. 隔离了客户与创建过程
  2. 按一定的次序调用,返回一个完整的产品对象。

1省略 Director

设计模式之(五)建造者模式_第7张图片
设计模式之(五)建造者模式_第8张图片### 2钩子方法的引入
建造者模式除了创建复杂的对象外,还可以通过导演类更加精细的控制产品的构建过程,可以增加一类钩子方法特殊调用某个builderPartX()方法
钩子方法通常为布尔型,方法名为is____,钩子方法定义在抽象建造者中,可以在游戏角色抽象建造者BaseBuilder中定义一个isBareheaded()方法,用于判断某个角色是否为“光头”,BaseBuilder提供一个默认的实现。返回值为false
设计模式之(五)建造者模式_第9张图片
在具体构造者覆盖isBareheaded()方法返回true

设计模式之(五)建造者模式_第10张图片
设计模式之(五)建造者模式_第11张图片

建造者模式的总结

主要优点

(1)客户端不需要知道产品内部组成的细节,将产品本身和产品的创建过程解耦,使得相同的创建过程创建不同的产品。
(2)每一个具体的建造者都相互独立,而与其他的具体建造者无关,可以很方便的替换和增加具体建造者,新的建造者可得到不同的产品对象。
(3)可以精细的控制产品的创建过程,将复杂产品的创建步骤,分解在不同的地方。

主要缺点

(1)建造者模式的产品一般有较多相同的共同点,其组成成分相同,如果产品之间的差异性比较大,就不适用建造者模式,范围受到一定的限制。
(2)如果产品的内部结构比较复杂,可能会需要很多具体建造者来实现这种变化,这将会导致系统变的过于庞大,增加系统的理解难度和运行成本。

适用场景

(1)需要生成的产品对象有复杂的内部结构,并且包含多个成员变量。
(2)需要生成的产品对象相互依赖,需要指定其生成顺序。
(3)对象的创建过程独立于创建该对象的类,在建造者模式中引入指挥者的类,将构建过程封装在指挥者类中而不再建造者类和客户类中。
(4)复杂隔离对象的创建和使用,使得相同的创建过程创建不同的产品。

你可能感兴趣的:(设计模式)