5.建造者模式【Builder Pattern】适用场景?优缺点?建造者模式与工厂模式对比?建造者模式实现?

目录


设计模式专栏目录(点击进入…)



建造者模式介绍

建造者模式就是将一个复杂对象的构建过程与其表示分离 , 使得同样的构建过程 , 可以创建不同的表示 ;用户只需要指定需要建造的类型就可以得到该类型对应的产品实例 , 不关心建造过程细节 ;建造者模式就是如何逐步构建包含多个组件的对象 , 相同的构建过程 , 可以创建不同的产品。


建造者模式适用场景

(1)结构复杂

对象有非常复杂的内部结构 , 有很多属性 ;

(2)分离创建和使用

想把复杂对象的创建和使用分离 ;

当创造一个对象需要很多步骤时 , 适合使用建造者模式 ;
当创造一个对象只需要一个简单的方法就可以完成 , 适合使用工厂模式 ;


建造者模式优缺点

优点

封装性好:创建和使用分离
扩展性好:建造类之间相互独立 , 在 一定程度上解耦

缺点

增加类数量:产生多余的 Builder 对象
内部修改困难 :如果产品内部发生变化 , 建造者也要相应修改


建造者模式与工厂模式

建造者模式工厂模式
关注点一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是“由零件一步一步地组装出产品对象”关注的是一个产品整体,如车辆整体,无须关心产品的各部分是如何创建出来的
注重点更注重于方法的调用顺序注重于创建产品 , 不关心方法调用的顺序
产品复杂度创建的则是一个复合产品,它由各个部件复合而成;建造者模式的产品对象粒度比较细创建的产品一般都是单一性质产品,工厂模式的对象粒度比较粗

建造者模式实现

在这里插入图片描述

1、房子

package com.uhhe.common.design.builder;

/**
 * 房子
 *
 * @author nizhihao
 * @version 1.0.0
 * @date 2023/2/28 11:31
 */
public class House {

    /**
     * 地基
     */
    private String foundation;

    /**
     * 砌墙
     */
    private String wall;

    /**
     * 封顶
     */
    private String roofed;

    public String getFoundation() {
        return foundation;
    }

    public void setFoundation(String foundation) {
        this.foundation = foundation;
    }

    public String getWall() {
        return wall;
    }

    public void setWall(String wall) {
        this.wall = wall;
    }

    public String getRoofed() {
        return roofed;
    }

    public void setRoofed(String roofed) {
        this.roofed = roofed;
    }

}

2、房子建造者抽象

package com.uhhe.common.design.builder;

/**
 * 房子建造者
 *
 * @author nizhihao
 * @version 1.0.0
 * @date 2023/2/28 11:32
 */
public abstract class HouseBuilder {

    protected House house = new House();

    /**
     * 打地基
     */
    public abstract void buildFoundation();

    /**
     * 砌墙
     */
    public abstract void buildWall();

    /**
     * 封顶
     */
    public abstract void roofed();

    /**
     * 建造
     *
     * @return House
     */
    public House buildHouse() {
        return house;
    }

}

3、建造者实现

公共建造

package com.uhhe.common.design.builder;

/**
 * 公共建造
 *
 * @author nizhihao
 * @version 1.0.0
 * @date 2023/2/28 11:33
 */
public class CommonHouseBuilder extends HouseBuilder {

    @Override
    public void buildFoundation() {
        System.out.println("common build foundation");
    }

    @Override
    public void buildWall() {
        System.out.println("common build wall");
    }

    @Override
    public void roofed() {
        System.out.println("common roofed");
    }

}

高楼建造者

package com.uhhe.common.design.builder;

/**
 * 高楼建造者
 *
 * @author nizhihao
 * @version 1.0.0
 * @date 2023/2/28 11:34
 */
public class HighHouseBuilder extends HouseBuilder {

    @Override
    public void buildFoundation() {
        System.out.println("high house build foundation");
    }

    @Override
    public void buildWall() {
        System.out.println("high build wall");
    }

    @Override
    public void roofed() {
        System.out.println("high roofed");
    }

}

4、建造指挥者

package com.uhhe.common.design.builder;

/**
 * 建造指挥者
 *
 * @author nizhihao
 * @version 1.0.0
 * @date 2023/2/28 11:35
 */
public class HouseCommander {

    HouseBuilder houseBuilder;

    /**
     * 构造器传入house builder
     *
     * @param houseBuilder HouseBuilder
     */
    public HouseCommander(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    /**
     * setter 传入house builder
     *
     * @param houseBuilder HouseBuilder
     */
    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }

    /**
     * 如何处理建造房子的流程,交给指挥者
     *
     * @return House
     */
    public House buildHouse() {
        houseBuilder.buildFoundation();
        houseBuilder.buildWall();
        houseBuilder.roofed();
        return houseBuilder.buildHouse();
    }

}

5、使用方法

package com.uhhe.common.design.builder;

/**
 * @author nizhihao
 * @version 1.0.0
 * @date 2023/2/28 11:37
 */
public class HouseClient {

    /**
     * 建造者模式【Builder Pattern】
     * <p>
     * 建造者模式又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),
     * 使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象
     * 建造者模式是一步一步建造一个复杂对象,它允许用户只通过指定复杂对象的类型和内容就可以建造他们,
     * 用户不需要指定内部的具体构建细节
     * <p>
     * <p>
     * 建造者模式四个角色:
     * ①Product(产品角色):
     * 一个具体的产品对象
     * ②Builder(抽象建造者):
     * 创建一个Product对象的各个部件指定的接口/抽象类
     * ③ConcreteBuilder(具体建造者):
     * 实现接口,构建和装配各个部件
     * ④Director(指挥者):
     * 构建一个使用Builder的对象,它主要是用于创建一个复杂的对象,它主要有两个作用,
     * 一:隔离了客户与对象的生产过程
     * 二:负责控制产品对象的生产过程
     */
    public static void main(String[] args) {
        CommonHouseBuilder commonHouseBuilder = new CommonHouseBuilder();
        House house = new HouseCommander(commonHouseBuilder)
                .buildHouse();
    }

}
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值