java设计模式-建造者模式

java设计模式-建造者模式

概念

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

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

  • 主要作用:在用户不知道对象的建造过程和细节 的情况下就可以直接创建复杂的对象。

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

  • 例子 :

  • 工厂(建造者模式)∶负责制造汽车(组装过>程和细节在工厂内)
  • 汽车购买者(用户)︰你只需要说出你需要的>型号((对象的类型和内容),然后直接购买就可以使用了(不需要知道汽车是怎么组装的(车轮、车门、>发动机、方向盘等等))

在这里插入图片描述
既然是建造者模式,那么我们还是继续造房吧,其实我也想不到更简单的例子。假设造房简化为如下步骤:
(1)地基
(2)钢筋工程
(3)铺电线
(4)粉刷;
如果 要盖一座房子,首先要找一个建筑公司或工程承包商(指挥者)。承包商指挥工人(具体建造者)过来造房子(产品),最后验收。

例子一

//抽象的建造者
public abstract class Builder {
    abstract void  BuilderA();//地基
    abstract void  BuilderB();//钢筋水泥
    abstract void  BuilderC();//铺电线
    abstract void  BuilderD();//粉刷
    //完工:得到产品
    abstract Product getProduct();
}

具体的工人

//具体的工人
public class Worker extends Builder{

    private Product product;

    public Worker(){
        product=new Product();
    }

    @Override
    void BuilderA() {
        product.setBuilderA("地基");
        System.out.println("地基建造完成");
    }

    @Override
    void BuilderB() {
        product.setBuilderB("钢筋工程");
        System.out.println("钢筋工程完成");
    }

    @Override
    void BuilderC() {
        product.setBuilderC("浦电线");
        System.out.println("浦电线完成");
    }

    @Override
    void BuilderD() {
        product.setBuilderD("粉刷");
        System.out.println("粉刷完成");

    }
	//获得产品
    @Override
    Product getProduct() {
        return product;
    }
}

产品:房子

public class Product {

    private String BuilderA;
    private String BuilderB;
    private String BuilderC;
    private String BuilderD;

   // 略... set get方法
}

指挥者

//指挥:指挥构建工程  如何构建由他决定
public class Director {
    //指挥工人 按照顺序建房子
    public Product build(Builder builder){
        builder.BuilderA();
        builder.BuilderB();
        builder.BuilderC();
        builder.BuilderD();
        return builder.getProduct();
    }
}

测试

public static void main(String[] args) {
        //指挥
        Director director=new Director();
        //指挥指挥工人创建房子
        Product build = director.build(new Worker());
        //打印房子
        System.out.println(build.toString());
    }

在这里插入图片描述

方式二

实现零件无序装配构造,这种方式使用更加灵法,更符合定义。内部有复杂对象的默认实现,使用时可以根据用户需求自由定义更改内容,并且无需改变具体的构造方式。就可以生产出不同复杂产品

比如:麦当劳的套餐,服务员(具体建造者)可以随意搭配任意几种产品(零件)组成一款套菱(产品),然后出售给客户。比第一种方式少了指挥者,主要是因为第二种方式把指挥者交给用户来操作,使得产品的创建更加简单灵活。

建造者

//建造者
public abstract class Builder {
    abstract Builder builderA(String msg);//汉堡
    abstract Builder builderB(String msg);//可乐
    abstract Builder builderC(String msg);//薯条
    abstract Builder builderD(String msg);//甜点

    abstract Product getProduct();
}

具体的实现构造者 服务员

//具体的建造者
public class Worker extends Builder{

    private Product product;

    //建造者创建产品
    public Worker(){
        product=new Product();
    }

    @Override
    Builder builderA(String msg) {
        product.setBuildA(msg);
        return this;
    }

    @Override
    Builder builderB(String msg) {
        product.setBuildB(msg);
        return this;
    }

    @Override
    Builder builderC(String msg) {
        product.setBuildC(msg);
        return this;
    }

    @Override
    Builder builderD(String msg) {
        product.setBuildD(msg);
        return this;
    }

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

具体的产品

//产品:套餐
public class Product {
	//没有设置就是默认的
    private String BuildA="汉堡";
    private String BuildB="可乐";
    private String BuildC="薯条";
    private String BuildD="甜点";
    //...略一些setget方法
    }

测试

public static void main(String[] args) {
        //服务员
        Worker worker=new Worker();
        Product product = worker.getProduct();
        //指挥者就是服务员  没有设置值就是默认的
        System.out.println(product.toString());

        //构建的顺序由客户指挥  在原来的基础上自由组合,如果不组合,就是默认的套餐
        Product product1 = worker.builderA("汉堡包").builderC("全家桶").builderD("薯片")
                .getProduct();
        System.out.println(product1.toString());
    }

与抽象工厂的比较

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值