设计模式(三)建造者模式

建造者模式

  • 建造者模式也属于创建模式,它提供了一种创建对象的最佳方式。
  • 定义:将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。
  • 用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)
  • 例子:
    • 工厂(建造者模式):负责制造汽车(组装过>程和细节在工厂内)
    • 汽车购买者(用户):你只要说出你需要的型号(对象的类型和内容),然后直接购买就可以使用了(不需要知道汽车是怎么组成的(车轮、车门、发动机 、方向盘 ))等

比如建一个房子(地基,钢筋工程,铺垫线,粉刷等来实现)包工头首先建一个抽象类(Bulider),把产品的图纸(Product)给了工人,工人(worker)按照包工头的图纸去建造,然后老板(director)去指挥它们去实现。

Builder(一个整体的产品需要什么)

package com.my.factory.builder;
//抽象的建造者:方法
public  abstract  class Builder {
    abstract void  builderaA();//地基
    abstract void  builderaB();//钢筋工程
    abstract void  builderaC();//铺垫线
    abstract void  builderaD();//粉刷
    //完工:得到产品
    abstract Product getProduct();
}

Product

package com.my.factory.builder;
//产品:房子
public class Product {
    private String buildA;
    private String buildB;
    private String buildC;
    private String buildD;

    public String getBuildA() {
        return buildA;
    }

    public void setBuildA(String buildA) {
        this.buildA = buildA;
    }

    public String getBuildB() {
        return buildB;
    }

    public void setBuildB(String buildB) {
        this.buildB = buildB;
    }

    public String getBuildC() {
        return buildC;
    }

    public void setBuildC(String buildC) {
        this.buildC = buildC;
    }

    public String getBuildD() {
        return buildD;
    }

    public void setBuildD(String buildD) {
        this.buildD = buildD;
    }

    @Override
    public String toString() {
        return "Product{" +
                "buildA='" + buildA + '\'' +
                ", buildB='" + buildB + '\'' +
                ", buildC='" + buildC + '\'' +
                ", buildD='" + buildD + '\'' +
                '}';
    }
}

worker

package com.my.factory.builder;
//具体的建造者:工人
public class Worker extends Builder {
    private Product product;
    public Worker(){
        product = new Product();
    }


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

    @Override
    void builderaB() {
        product.setBuildA("钢筋");
        System.out.println("钢筋");
    }

    @Override
    void builderaC() {
        product.setBuildA("铺垫线");
        System.out.println("铺垫线");
    }

    @Override
    void builderaD() {
        product.setBuildA("粉刷墙面");
        System.out.println("粉刷墙面");
    }

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

Directory

package com.my.factory.builder;
//指挥:核心负责构建一个工程,工程如何构建,由它决定
public class Director {
    //指挥工人按顺序建房子
    public  Product build(Builder builder){
        builder.builderaA();
        builder.builderaB();
        builder.builderaC();
        builder.builderaD();
        return builder.getProduct();
    }
}

交工(测试)

package com.my.factory.builder;

public class Test {
    public static void main(String[] args) {
        //指挥
        Director director = new Director();
        //指挥具体的工人完成 产品
        Product build = director.build(new Worker());
        String s = build.toString();
        System.out.println(s);
    }
}

总结

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

另一种案列见建造者模式之链式编程

posted @ 2021-11-25 14:57  不会笑的孩子  阅读(26)  评论(0编辑  收藏  举报