设计模式_建造者模式

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

该模式的主要优点如下:

  1. 各个具体的建造者相互独立,解耦度高,有利于系统的扩展。
  2. 客户端不必知道产品内部组成的细节,可直接使用,规避风险。


其缺点如下:

  1. 产品的组成部分必须相同,这限制了其使用范围。
  2. 如果产品的内部变化复杂,该模式会增加很多的建造者类,导致可维护性差。


建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程(组成部分要相同),而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

模式的结构与实现

建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。

1. 模式的结构

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

  1. 产品角色(House):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
  2. 抽象建造者(AbsBuilder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
  3. 具体建造者(*Builder):实现/继承 AbsBuilder 接口/抽象方法,完成复杂产品的各个部件的具体创建方法。
  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

1、抽象构建者

package com.zzyo.build;

//抽象建造者
public abstract class AbsBuilder {
    abstract void buildPartA();

    abstract void buildPartB();

    abstract void buildPartC();

    House getResult(){
        return new House();
    }
}

2、具体建造者

package com.zzyo.build;
//普通建造者
public class CommonBuilder extends AbsBuilder{
    @Override
    void buildPartA() {
        System.out.println("普通计划A " );
    }

    @Override
    void buildPartB() {
        System.out.println("普通计划B " );
    }

    @Override
    void buildPartC() {
        System.out.println("普通计划C" );
    }
}
package com.zzyo.build;
//高级建造者
public class HighBuilder extends AbsBuilder {
    @Override
    void buildPartA() {
        System.out.println("高级计划A");
    }

    @Override
    void buildPartB() {
        System.out.println("高级计划B");
    }

    @Override
    void buildPartC() {
        System.out.println("高级计划C");
    }
}

3、产品

package com.zzyo.build;

import lombok.Data;

@Data
public class House {

    String partA;
    String partB;
    String partC;
}

4、构建者,装修工人

package com.zzyo.build;
//构建者 装修工人
public class Director {
    private AbsBuilder absBuilder;

    //构建
    public Director(AbsBuilder absBuilder) {
        this.absBuilder = absBuilder;
    }

    //产品组装与构建
    public House construct() {
        absBuilder.buildPartA();
        absBuilder.buildPartB();
        absBuilder.buildPartC();
        return absBuilder.getResult();

    }
}

5、客户端测试

package com.zzyo.build;

//测试客户端
public class Clien {
    public static void main(String[] args) {
        CommonBuilder commonBuilder = new CommonBuilder();
        Director director = new Director(commonBuilder);
        director.construct();

        HighBuilder highBuilder = new HighBuilder();
        Director director1 = new Director(highBuilder);
        director1.construct();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值