07建造者模式

一、什么是建造者模式

Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。

Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建
过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。


二、建造者模式结构

   其中建造者时一个公共接口,提供构造的方法;具体的建设者实现建设者接口,提供一个全局的获取建设者的方法;

设计者Director需要提供一个建造者实例,以及一个具体的建造方法;最终产品由具体的建造者来提供。

 

 

三、建造者模式应用的场景

1)对象的创建:Builder模式是为对象的创建而设计的模式
2)创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象
3)关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法

四、代码实现实例

目标:建造房子

首先提供一个房子类及其相关的属性

public class House {

    private String floor;//地板
    private  String wall;//墙
    private String roof;//屋顶

    public String getFloor() {
        return floor;
    }

    public void setFloor(String floor) {
        this.floor = floor;
    }

    public String getWall() {
        return wall;
    }

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

    public String getRoof() {
        return roof;
    }

    public void setRoof(String roof) {
        this.roof = roof;
    }


    @Override
    public String toString() {
        return "House{" +
                "floor='" + floor + '\'' +
                ", wall='" + wall + '\'' +
                ", roof='" + roof + '\'' +
                '}';
    }
}

设计实现一个房屋的建造者(接口-----》施工队伍)

/**
 * 房屋构造工程队
 */
public interface HouseBuilder {

    public void makeFloor();
    public void makeWall();
    public void makeRoof();

    public House getHouse();
}

我们将要修改一个瓦房:

package com.dzg.learn.builder;

/**
 * 瓦房构造工程队
 */
public class WaFangBuilder implements HouseBuilder{
    House house = new House();

    public void makeFloor() {

        house.setFloor("瓦房-->地板");
    }

    public void makeWall() {

        house.setWall("瓦房--》墙");
    }

    public void makeRoof() {

        house.setRoof("瓦房--》房顶");
    }

    public House getHouse() {
        return house;
    }
}
package com.dzg.learn.builder;

提供一个设计师来设计如何构造房子:
/**
 * 房屋设计师
 */
public class HouseDirector {
  /*  private HouseBuilder houseBuilder;
    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }*/

    public void makeHouse(HouseBuilder houseBuilder){
        houseBuilder.makeFloor();
        houseBuilder.makeWall();
        houseBuilder.makeRoof();
    }
}

然后只需要,设计师让施工队对房子进行相应的构造实现即可


public class TestBuilder {
    public static void main(String[] args) {

        HouseBuilder houseBuilder = new WaFangBuilder();//工程队    

        /*
            当需要修改其他的房子时,只需要添加一个新的Builder
            例如,当需要对楼房进行修改时,只需要添加一个BuildingBuilder类,实现时只需要修改new BuildingBuilder();即可
         */
        HouseDirector houseDirector = new HouseDirector();//设计师对房屋进行设计
        houseDirector.makeHouse(houseBuilder);//设计师调用叫工程队来构造房子

        House house = houseBuilder.getHouse();//获得一个房子
        System.out.println(house.toString());//工程队施工
    }
}

House{floor='瓦房-->地板', wall='瓦房--》墙', roof='瓦房--》房顶'}


注:对于房屋的属性,可以是复合属性

比如对于Floor可以提供两个选择:大理石或磨砂,toString方法中需要对所要获得的地板样式进行判断

public String toString() {
    if(floor.getDalishi()==null)
        return "House{" +
                "floor='" + floor.getMosha()+'\'' +
                ", wall='" + wall + '\'' +
                ", roof='" + roof + '\'' +
                '}';
    else{
        return "House{" +
                "floor='" + floor.getDalishi()+'\'' +
                ", wall='" + wall + '\'' +
                ", roof='" + roof + '\'' +
                '}';
    }
}

在瓦房建造者中,对瓦房屋顶的实现进行更改

public void makeFloor() {

    Floor floor1 = new Floor();
    floor1.setMosha("磨砂");
    house.setFloor(floor1);
    //house.setFloor("瓦房-->地板");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值