建造者模式

1.建造者模式的定义和特点

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

该模式的主要优点如下:

  1. 各个具体的建造者相互独立,有利于系统的扩展。
  2. 客户端不必知道产品内部组成的细节,便于控制细节风险。

其缺点如下:

  1. 产品的组成部分必须相同,这限制了其使用范围。
  2. 如果产品的内部变化复杂,该模式会增加很多的建造者类。

建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。

2.建造者模式的结构与实现

1.模式的结构
建造者(Builder)模式的主要角色:

  1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个部件
  2. 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()
  3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法
  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息

2.结构图
在这里插入图片描述

3.实现
使用建造者模式描述客房装修?
     分析:客房装修是一个复杂的过程,它包含墙体的装修、电视机和床的布局等,酒店老板把装修的需求告诉专门的装修公司,装修公司找具体的装修工人一步步完成客房的装修。
     这里客房是产品,包含墙、电视机、床等组成。具体的装修工人是具体的建造者,负责装修墙以及电视和床的布局,装修公司是指挥者,负责指挥装修工人进行装修。

测试代码:

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

        IRoomBuilder builder = new NomalRoomBuilder();
        RoomDirector director = new RoomDirector(builder);
        GuestRoom guestRoom = director.build();
        guestRoom.show();

        IRoomBuilder starBuilder = new StarRoomBuilder();
        RoomDirector director1 = new RoomDirector(starBuilder);
        GuestRoom guestRoom1 = director1.build();
        guestRoom1.show();
    }
}

运行结果:

毛坯装修墙 黑白电视 木板床
精装修的墙 智能电视机 欧式风格的床

产品

/**
 * 客房
 */
public class GuestRoom {
    //墙
    private String wall;
    //电视
    private String tv;
    //床
    private String bed;

    public String getWall() {
        return wall;
    }

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

    public String getTv() {
        return tv;
    }

    public void setTv(String tv) {
        this.tv = tv;
    }

    public String getBed() {
        return bed;
    }

    public void setBed(String bed) {
        this.bed = bed;
    }

    /**
     * 展示酒店信息
     */
    public void show() {
        System.out.println(wall + " " + tv + " " + bed);
    }
}

建造者:

/**
 * 抽象建造者:客房装修工人
 */
public interface IRoomBuilder {

    GuestRoom getGuestRoom();

    void buildWall();

    void buildTv();

    void buildBed();
}

/**
 * 具体建造者:普通客房装修工人
 */
public class NomalRoomBuilder implements IRoomBuilder {

    private GuestRoom guestRoom = new GuestRoom();

    @Override
    public GuestRoom getGuestRoom() {
        return guestRoom;
    }

    @Override
    public void buildWall() {
        this.guestRoom.setWall("毛坯装修墙");
    }

    @Override
    public void buildTv() {
        this.guestRoom.setTv("黑白电视");
    }

    @Override
    public void buildBed() {
        this.guestRoom.setBed("木板床");
    }
}

/**
 * 具体建造者:星级豪华客房装修工人
 */
public class StarRoomBuilder implements IRoomBuilder {

    private GuestRoom guestRoom = new GuestRoom();

    @Override
    public GuestRoom getGuestRoom() {
        return guestRoom;
    }

    @Override
    public void buildWall() {
        this.guestRoom.setWall("精装修的墙");
    }

    @Override
    public void buildTv() {
        this.guestRoom.setTv("智能电视机");
    }

    @Override
    public void buildBed() {
        this.guestRoom.setBed("欧式风格的床");
    }
}

指挥者:

/**
 * 指挥者:装修公司
 */
public class RoomDirector {

    private IRoomBuilder builder;

    public RoomDirector(IRoomBuilder builder) {
        this.builder = builder;
    }

    /**
     * 产品构建与组装方法:装修房子
     */
    public GuestRoom build() {
        builder.buildWall();
        builder.buildTv();
        builder.buildBed();
        return builder.getGuestRoom();
    }
}

Demo地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值