建筑者模式【图解,清晰思路】代码演示实现

建造者(Builder)模式的定义:

指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

该模式的主要优点如下:

• 各个具体的建造者相互独立,有利于系统的扩展。
• 客户端不必知道产品内部组成的细节,便于控制细节风险。

其缺点如下:

• 产品的组成部分必须相同,这限制了其使用范围。
• 如果产品的内部变化复杂,该模式会增加很多的建造者类。

建造者(Builder)模式和工厂模式的关注点不同:

  • 建造者模式注重零部件的组装过程
  • 而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

模式的结构

建造者(Builder)模式的主要角色如下。

  • 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。

  • 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。

  • 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。

  • 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

为什么要使用抽象建造者,不直接使用具体创造者?

  • 稳定创建过程:使用接口或者抽象类时,子类继承或实现,一定会实现父类方法,而如果不使用的话,在写具体创造者的过程中可能因为马虎,造成每一个具体实现类有可能不一样。

接下来我用UML类图展示建筑者模式的结构
在这里插入图片描述

下面我来用代码演示过程

1. Human 产品类

package com.ncst.bulider;

/**
 * @Date 2020/8/8 14:54
 * @Author by LiShiYan
 * @Descaption
 */
public class Human {
    private String eye;
    private String mouth;
    private String leg;

    public String getEye() {
        return eye;
    }

    public void setEye(String eye) {
        this.eye = eye;
    }

    public String getMouth() {
        return mouth;
    }

    public void setMouth(String mouth) {
        this.mouth = mouth;
    }

    public String getLeg() {
        return leg;
    }

    public void setLeg(String leg) {
        this.leg = leg;
    }

    @Override
    public String toString() {
        return "Human{" +
                "eye='" + eye + '\'' +
                ", mouth='" + mouth + '\'' +
                ", leg='" + leg + '\'' +
                '}';
    }
}

2.HumanBuilder 抽象建筑者接口

package com.ncst.bulider;

/**
 * @Date 2020/8/8 14:52
 * @Author by LiShiYan
 * @Descaption
 */
public interface HumanBuilder {
    void setEye();

    void setLeg();

    void setMouth();

    //返回人的身体
    Human getBOdy();
}

3.BlackHuman 具体建造者1

package com.ncst.bulider;

/**
 * @Date 2020/8/8 14:58
 * @Author by LiShiYan
 * @Descaption
 */
public class YellowHuman implements HumanBuilder {
  private   Human human = new Human();

    @Override
    public void setEye() {
        human.setEye("黑黑的眼睛");
    }

    @Override
    public void setLeg() {
        human.setLeg("长长的腿");
    }

    @Override
    public void setMouth() {
        human.setMouth("红红的嘴");
    }

    @Override
    public Human getBOdy() {
        return human;
    }
}

BlackHuman 具体建筑者2

package com.ncst.bulider;

/**
 * @Date 2020/8/8 14:58
 * @Author by LiShiYan
 * @Descaption
 */
public class BlackHuman implements HumanBuilder {
   private Human human = new Human();

    @Override
    public void setEye() {
        human.setEye("蓝蓝的眼睛");
    }

    @Override
    public void setLeg() {
        human.setLeg("短短的腿");
    }

    @Override
    public void setMouth() {
        human.setMouth("黑黑的嘴");
    }

    @Override
    public Human getBOdy() {
        return human;
    }
}

4.DIrector 指挥者

package com.ncst.bulider;

/**
 * @Date 2020/8/8 15:10
 * @Author by LiShiYan
 * @Descaption
 */
public class Director {

    public Human build(HumanBuilder humanBuilder) {
        humanBuilder.setEye();
        humanBuilder.setMouth();
        humanBuilder.setLeg();

        return humanBuilder.getBOdy();
    }
}

5.Client测试类
我们使用建造者模式,当添加一个新类,如白种人类,会非常简单,符合OCP原则
添加白种人类如法炮制不在演示

package com.ncst.bulider;

/**
 * @Date 2020/8/8 15:09
 * @Author by LiShiYan
 * @Descaption
 */
public class Client {
    public static void main(String[] args) {

        Human black = new Director().build(new BlackHuman());
        System.out.println("黑种人"+black);

        //新添加一个白种人
        Human white=new Director().build(new WhiteHuman());
        System.out.println("白种人"+white);
    }
}

测试结果
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值