建造者模式

本文介绍了建造者模式的概念、适用场景及实现方式。通过一个具体的房屋建造案例,详细展示了建造者模式如何将复杂对象的构建过程与表示分离,使得相同的构建过程能够创建不同的表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是建造者模式?

将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。 

二、适用场景:

1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2、当构造过程必须允许被构造的对象有不同的表示时。  

三、模式中包含的角色及其职责

在这样的设计模式中,有以下几个角色: 

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

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

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

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

/**
 * @Title: House.java
 * @Package
 * @Description: product--表示构造的复杂对象
 * @author xiaozhi
 * @date 2016年12月2日 下午6:41:32
 * @version V1.0
 */

public class House {
    private String floor;
    private String wall;
    private String housetop;

    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 getHousetop() {
        return housetop;
    }

    public void setHousetop(String housetop) {
        this.housetop = housetop;
    }
}
/**
 * @Title: HouseBuider.java
 * @Package
 * @Description: 为创建一个产品对象的各个部件指定抽象接口。--施工队
 * @author xiaozhi
 * @date 2016年12月2日 下午6:52:05
 * @version V1.0
 */

public interface HouseBuider {
    public void makeFloor();

    public void makeWall();

    public void makeHousetop();

    public House getHouse();

}
/**
 * @Title: PingFangBuider.java
 * @Package
 * @Description: ConcreteBuilder--平房施工队
 * @author xiaozhi
 * @date 2016年12月2日 下午6:55:19
 * @version V1.0
 */

public class PingFangBuider implements HouseBuider {

    House house = new House();

    @Override
    public void makeFloor() {

        house.setFloor("平房-修建地板");
    }

    @Override
    public void makeWall() {
        house.setWall("平房-修建墙壁");

    }

    @Override
    public void makeHousetop() {
        house.setHousetop("平房-修建房顶");

    }

    public House getHouse() {
        return this.house;
    }

}
/**
 * @Title: GongyuBuider.java
 * @Package
 * @Description: ConcreteBuilder--公寓施工队
 * @author xiaozhi
 * @date 2016年12月2日 下午7:16:34
 * @version V1.0
 */

public class GongyuBuider implements HouseBuider {

    House house = new House();

    @Override
    public void makeFloor() {
        house.setFloor("公寓-修建地板");

    }

    @Override
    public void makeWall() {
        house.setWall("公寓-修建墙壁");

    }

    @Override
    public void makeHousetop() {
        house.setHousetop("公寓-修建屋顶");

    }

    @Override
    public House getHouse() {

        return this.house;
    }

}
/**
 * @Title: HouseDirector.java
 * @Package
 * @Description: 构造一个使用Builder接口的对象。---设计师
 * @author xiaozhi
 * @date 2016年12月2日 下午7:09:40
 * @version V1.0
 */

public class HouseDirector {
    // 构造一个使用Builder接口的对象
    HouseBuider houseBuider;

    public HouseDirector(HouseBuider houseBuider) {
        this.houseBuider = houseBuider;
    }

    public void makeHouse() {
        houseBuider.makeFloor();
        houseBuider.makeHousetop();
        houseBuider.makeWall();
    }

}
/**
 * @Title: MainClass.java
 * @Package
 * @Description: 测试类
 * @author xiaozhi
 * @date 2016年12月2日 下午6:41:49
 * @version V1.0
 */

public class MainClass {
    public static void main(String[] args) {
        //
        // House house=new House();
        // house.setFloor("地板");
        // house.setWall("墙壁");
        // house.setHousetop("屋顶");
        //
        // System.out.println(house.getFloor());
        // System.out.println(house.getHousetop());
        // System.out.println(house.getWall());

        // 创建平房施工队
        HouseBuider houseBuider = new PingFangBuider();
        // 设计者请来平房施工队
        HouseDirector houseDirector = new HouseDirector(houseBuider);
        // 设计者通过调用平房施工队建造房子
        houseDirector.makeHouse();
        House house = houseBuider.getHouse();
        System.out.println(house.getFloor());
        System.out.println(house.getWall());
        System.out.println(house.getHousetop());
        System.out.println();
        System.out.println();

        // 公寓施工队
        HouseBuider houseBuider1 = new GongyuBuider();
        HouseDirector houseDirector1 = new HouseDirector(houseBuider1);
        houseDirector1.makeHouse();
        House house1 = houseBuider1.getHouse();
        System.out.println(house1.getFloor());
        System.out.println(house1.getWall());
        System.out.println(house1.getHousetop());
    }

}

五、测试结果:

平房-修建地板
平房-修建墙壁
平房-修建房顶


公寓-修建地板
公寓-修建墙壁
公寓-修建屋顶
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值