设计模式 —— Builder 模式

本文围绕Builder模式展开,介绍其核心思想,即注重产品组装过程,与抽象工厂注重结果不同。阐述了两种Builder模式,第一种结合了抽象工厂和模板模式,但存在指挥者作用不明、代码冗余等问题;第二种在客户端更能体现过程,灵活性强,还可结合抽象工厂模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 Builder 模式的核心思想

  • Builder 模式注重过程,它关注与产品的组装过程
  • 而抽象工厂注重结果,是对结果的抽象,客户端不知道过程

2 第一种 Builder 模式

  • 首先定义一个抽象的 Builder 类:规定了子类必须实例化的方法
public abstract class PersonBuilder {
    Person person;
    public abstract void buildHead();
    public abstract void buildBody();
    public abstract void buildArmLeft();
    public abstract void buildArmRight();
    public abstract void buildLegLeft();
    public abstract void buildLegRight();
}
  • 然后实例化一个具体的 Builder 实例
public class PersonThinBuilder extends PersonBuilder {
    public PersonThinBuilder() {
        person = new Person();
    }
    @Override
    public void buildHead() {
        person.setHead("小头");
    }
    // 其它代码略
  • 最后实例化一个 Director(指挥者),抽象创建过程
public class PersonDirector {
    private PersonBuilder pb;
    public PersonDirector(PersonBuilder pb) {
        this.pb = pb;
    }
    //这里就是创建者模式的核心创建过程,但是这个确定的过程完全可以直接放在 PersonBuilder 类中啊
    public Person createPerson() {
        pb.buildArmLeft();
        pb.buildArmRight();
        pb.buildBody();
        pb.buildHead();
        pb.buildLegLeft();
        pb.buildLegRight();
        return pb.person;
    }
}
@Test
public void test() {
	//客户端程序
    PersonDirector pd = new PersonDirector(new PersonThinBuilder());
    Person p = pd.createPerson();
    System.out.println(p);
}

3 第一种模式的困惑

  • 这个模式在指挥者中定义了产品创建的过程,完全可以不需要这个指挥者,将这个过程直接放入创建者中。这各指挥者起什么作用呢?
  • 我觉得这一种模式就是抽象工厂(PersonBuilder )和模板模式(createPerson)的结合体,而且这个模板模式的代码很冗余
  • 这种模式在客户端仍然没体现过程

4 第二种 Builder 模式

public class PersonBuilder0 {
    private Person person;
    public PersonBuilder0() {
        person = new Person();
    }
    public PersonBuilder0 buildBody(String body) {
        person.setBody(body);
        return this;
    }
    public PersonBuilder0 buildHead(String head) {
        person.setHead(head);
        return this;
    }
    public PersonBuilder0 buildArmLeft(String leftArm) {
        person.setArmLeft(leftArm);
        return this;
    }
    public PersonBuilder0 buildArmRight(String rightArm) {
        person.setArmRight(rightArm);
        return this;
    }
    public PersonBuilder0 buildLegLeft(String leftLeg) {
        person.setLegLeft(leftLeg);
        return this;
    }
    public PersonBuilder0 buildLegRight(String rightLeg) {
        person.setLegRight(rightLeg);
        return this;
    }
    public Person build() {
        return person;
    }
}
@Test
public void test() {
    Person p = new PersonBuilder0().buildArmLeft("大左胳膊").buildArmLeft("小右胳膊").build();
    System.out.println(p);//没有手和头
}

5 第二种 Builder 模式见解

  • 很明显第二种模式客户端的是很体现过程的
  • 而且灵活些也很强,客户端可以任意的组装,形成不同的产品
  • 并且如果 Person 中的组件很复杂,也可以结合抽象工厂模式建立一个 Person 组件的抽象工厂,客户通过抽象工厂方便的选择想要的组件

6 参考

大话设计模式
Head First 设计模式
设计模式
github 源码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值