Day03-设计模式之建造者模式

设计模式之建造者模式

建造者模式介绍

  • 建造者模式也属于创建型模式,它提供了一种创建对象的最佳方式。

  • 意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

  • 用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)

  • 建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

类比举例

  • 汽车购买者(用户)︰你只需要说出你需要的>型号(对象的类型和内容),然后直接购买就可以使用了(不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等)

角色分析

建造者模式的四个角色:

1、Product(产品角色):一个具体的产品对象

2、Builder(抽象建造者):创建一个Product对象的各个部件指定的接口。

3、ConcreteBuilder(具体的建造者):实现接口,构建和装配各个部件。

4、Director(指挥者): 构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

image-20230227195921106

既然是建造者模式,那么可以以造房子为例子。假设造房简化为步骤:(1)地基 (2)钢筋工程 (3)铺电线 (4)粉刷;“如果”要盖一座房子,首先要找一个建筑公司或工程承包商(指挥者)。承包商指挥工人(具体建造者)过来造房子(产品),最后验收。

代码例子

package day03.builder;

/**
 * @author coolsheep
 * @date 2023/2/27 20:03
 * @Describe 定义建造者的方法
 */
public interface Builder {
    void buildA();//地基

    void buildB();//钢筋工程

    void buildC();//铺电线

    void buildD();//粉刷

    //完工:得到产品
    Product getProduct();
}

package day03.builder;

/**
 * @author coolsheep
 * @date 2023/2/27 20:48
 * @Describe 具体的建造者:工人
 */
public class Worker implements Builder{

    private Product product;

    //工人负责创建产品
    public Worker() {
        product = new Product();
    }

    @Override
    public void buildA() {
        product.setBuildA("地基");
        System.out.println("地基");
    }

    @Override
    public void buildB() {
        product.setBuildB("钢筋工程");
        System.out.println("钢筋工程");
    }

    @Override
    public void buildC() {
        product.setBuildC("铺电线");
        System.out.println("铺电线");
    }

    @Override
    public void buildD() {
        product.setBuildD("粉刷");
        System.out.println("粉刷");
    }

    @Override
    public Product getProduct() {
        return product;
    }
}

package day03.builder;

import lombok.Data;

/**
 * @author coolsheep
 * @date 2023/2/27 20:05
 * @Describe
 */
//产品:房子
@Data
public class Product {
    private String buildA;
    private String buildB;
    private String buildC;
    private String buildD;
}

package day03.builder;

/**
 * @author coolsheep
 * @date 2023/2/27 20:53
 * @Describe 指挥:核心。负责指挥构建一个工程,工程如何创建,由它决定
 */
public class Director {

    //指挥工人安装顺序建房子
    public Product build(Builder builder) {
        builder.buildA();
        builder.buildB();
        builder.buildC();
        builder.buildD();
        return builder.getProduct();
    }
}

package day03.builder;

/**
 * @author coolsheep
 * @date 2023/2/27 20:57
 * @Describe
 */
public class Test {
    public static void main(String[] args) {
        //指挥
        Director director = new Director();
        //指挥 具体的工人完成产品
        Product build = director.build(new Worker());
        System.out.printf(build.toString));
    }
}

  • 上面示例是Builder模式的常规用法,导演类Director在Builder模式中具有很重要的作用,它用于指导具体构建者如何构建产品,控制调用先后次序,并向调用者返回完整的产品类,但是有些情况下需要简化系统结构,可以把Director和抽象建造者进行结合。

  • 内部有复杂对象的默认实现,使用时可以根据用户需求自由定义更改内容,并且无需改变具体的构造方式。就可以生产出不同复杂产品

应用场景

需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。适合于一个具有较多的零件(属性)的产品(对象)的创建过程。

建造者模式的注意事项
1)客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

2)每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。

3)可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

4)增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便。

posted @ 2023-03-04 17:09  晴天阴天下雨天  阅读(34)  评论(0)    收藏  举报