九、建造者模式——设计模式学习笔记

本文深入讲解了建造者模式的基本概念、应用场景及其实现方法。通过一个具体的机器人组装案例,展示了如何利用建造者模式来分离产品的构建过程与表示,从而简化复杂对象的创建。此外,还提供了详细的Java代码示例。
作为一个编程菜鸟,过去在学习设计模式的时候,老师给推荐了一本《大话设计模式》。阅读以后受益匪浅,可惜当初没有坚持看完。
最近有时间了,又重新捡起来学习了一遍,整理了一下笔记,由于本人能力有限,欢迎大家批评指正。

1.建造者模式 Builder Pattern

  • 建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 通过建造者模式,用户只需指定需要建造的类型就可以得到它们,而具体建造的过程细节就不需要知道了。

2.应用场景

  • 当构造过程必须允许被构造的对象有不同表示时。
  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 这些对象内部构建间的建造顺序通常是稳定的,但对象的构建通常面临着复杂的变化。

3.优点

使建造代码与表示分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

4.uml类图

这里写图片描述

5.组成

(1)Builder

为创建一个产品对象的各个部件指定抽象接口。

(2)ConcreteBuilder

实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。

(3)Director

构造一个使用Builder接口的对象。

(4)Product

表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

6.实例

(1)机器人产品类
package com.longinus.bp;
import java.util.*;
public class Robot {
    private List<String> robot = new ArrayList<>();

    public void add(String compoent){
        robot.add(compoent);
    }

    public void show(){
        System.out.print("机器人崭新出厂:");
        for(String str : robot){
            System.out.print(str + " ");
        }
        System.out.println();
    }
}
(2)机器人建造抽象类
package com.longinus.bp;
public abstract class RobotBuilder {
    public abstract void buildHead();
    public abstract void buildBody();
    public abstract void buildFoot();
    public abstract Robot buildRobot();
}
(3)具体机器人建造类A
package com.longinus.bp;
public class ConcreteRobotBuilderA extends RobotBuilder{
    private Robot robot = new Robot();

    @Override
    public void buildHead() {
        // TODO Auto-generated method stub
        robot.add("头部零件A");
    }
    @Override
    public void buildBody() {
        // TODO Auto-generated method stub
        robot.add("身体零件A");
    }
    @Override
    public void buildFoot() {
        // TODO Auto-generated method stub
        robot.add("腿部零件A");
    }
    @Override
    public Robot buildRobot() {
        // TODO Auto-generated method stub
        return robot;
    }
}
(4)具体机器人建造类B
package com.longinus.bp;
public class ConcreteRobotBuilderB extends RobotBuilder{

    private Robot robot = new Robot();

    @Override
    public void buildHead() {
        // TODO Auto-generated method stub
        robot.add("头部零件B");
    }
    @Override
    public void buildBody() {
        // TODO Auto-generated method stub
        robot.add("身体零件B");
    }
    @Override
    public void buildFoot() {
        // TODO Auto-generated method stub
        robot.add("腿部零件B");
    }
    @Override
    public Robot buildRobot() {
        // TODO Auto-generated method stub
        return robot;
    }
}
(5)指挥类
package com.longinus.bp;
public class Director {
    public void construct(RobotBuilder builder){
        builder.buildHead();
        builder.buildBody();
        builder.buildFoot();
    }
}
(6)测试类
package com.longinus.bp;
public class Test {
    public static void main(String[] args) {
        Robot robot;
        Director director = new Director();

        ConcreteRobotBuilderA rba = new ConcreteRobotBuilderA();
        ConcreteRobotBuilderB rbb = new ConcreteRobotBuilderB();

        director.construct(rba);
        robot = rba.buildRobot();
        robot.show();

        director.construct(rbb);
        robot = rbb.buildRobot();
        robot.show();
    }
}
(7)输出结果
机器人崭新出厂:头部零件A 身体零件A 腿部零件A 
机器人崭新出厂:头部零件B 身体零件B 腿部零件B 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值