四、建造者模式

1.动机

在软件系统中,存在某些复杂对象的构建工作,其通常由各个部分的子对象用一定的算法组成。由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法确相对稳定,如何提供一种封装离机制隔离各个部分的变化,从而保持系统中稳定构建算法不随着需求改变而改变?

2.实现

(1)要构建的产品
package com.example.demo.builder;

public class House {

    private String floor;

    private String wall;

    private String window;

    private String door;

    private String houseCelling;


    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 getWindow() {
        return window;
    }

    public void setWindow(String window) {
        this.window = window;
    }

    public String getDoor() {
        return door;
    }

    public void setDoor(String door) {
        this.door = door;
    }

    public String getHouseCelling() {
        return houseCelling;
    }

    public void setHouseCelling(String houseCelling) {
        this.houseCelling = houseCelling;
    }

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

(2)构建器抽象类

package com.example.demo.builder;

public interface HouseBuilder {

    void buildDoor();

    void buildWall();

    void buildWindows();

    void buildFloor();

    void buildHouseCelling();

    House buildHouse();
}
(3)导演类
package com.example.demo.builder;

public abstract class HouseDirect {

    /**
     * 算法相对稳定 先建地板,再打墙....
     * @param builder 生成器实例
     * @return house 实例
     */
    public static House createHouse(HouseBuilder builder){
        builder.buildFloor();
        builder.buildWall();
        builder.buildWindows();
        builder.buildHouseCelling();
        builder.buildDoor();
        return builder.buildHouse();
    }

}
(3) 建造者实现类
package com.example.demo.builder;

import org.springframework.beans.BeanUtils;

public class PinkHouseBuilder implements HouseBuilder{

    private String floor;

    private String wall;

    private String window;

    private String door;

    private String houseCelling;

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

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

    public void setWindow(String window) {
        this.window = window;
    }

    public void setDoor(String door) {
        this.door = door;
    }

    public void setHouseCelling(String houseCelling) {
        this.houseCelling = houseCelling;
    }

    public String getFloor() {
        return floor;
    }

    public String getWall() {
        return wall;
    }

    public String getWindow() {
        return window;
    }

    public String getDoor() {
        return door;
    }

    public String getHouseCelling() {
        return houseCelling;
    }

    @Override
    public void buildDoor() {
        this.door = "粉色的门";
    }

    @Override
    public void buildWall() {
        this.wall = "粉色的墙";
    }

    @Override
    public void buildWindows() {
        this.window = "粉色的窗户";
    }

    @Override
    public void buildFloor() {
        this.floor = "粉色的地板";
    }

    @Override
    public void buildHouseCelling() {
        this.houseCelling = "粉色的天花板";
    }

    @Override
    public House buildHouse() {
        House house = new House();
        BeanUtils.copyProperties(this, house);
        return house;
    }
}

3.要点

  • 建造者模式主要用于分步骤构建一个复杂对象,在其中分步骤是一个稳定的算法,但是复杂对象的各个部分则会发生各种变化
  • 建造者模式主要在于复杂对象各个部分的频繁变动,但是难以应对分步骤构建算法的变动
  • 抽象工厂主要解决系列对象的需求变化,建造者模式解决对象啊部分的需求变化
  • 建造者模式通常和组合模式一起使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值