创建型模式之建造者模式

假如有一个盖房的项目需求

要求

盖房子有个三个步骤,打桩,砌墙,封顶

房子有各种各样的,比如普通房,高楼,别墅

解决方案
①传统方式

将盖房的方法统一封装到一个父类,用子类(普通房,高楼,别墅)去继承盖房

盖房统一父类House.java

public abstract class House{
    //通用的打桩方法
    void abstract buildBasic();
    //通用的砌墙方法
    void abstract buildWalls();
    //通用的封顶方法
    void abstract roofed();
    //通用的建房方法合集
    public void build(){
        buildBasic();
        buildWalls();
        roofed();
    }
}

建造普通房子类CommonHouse.java

public class CommonHouse extends House{
    @Override
    public void buildBasic(){
        sout("普通房子打桩")
    }
    @Override
    public void buildWalls(){
        sout("普通房子砌墙")
    }
    @Override
    public void roofed(){
        sout("普通房子封顶")
    }
}

客户端Client.java

public class Client{
    public static void main(String[] args){
        new CommonHouse().build();
    }
}

问题:

  • 优点比较好理解,简单易操作
  • 设计程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好,也就是说,这种设计方案,把产品(即:房子)和创建产品的过程(即:建房子流程)封装在一起,耦合性强。
  • 解决方案:将产品和产品建造过程解耦==》建造者模式
②建造者模式

基本介绍

  • 建造者模式又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构建出不同表现的对象
  • 建造者模式使一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户需要知道内部的具体构建细节。

建造者模式的四个角色

  • 产品角色:一个具体的产品对象
  • 抽象建造者:创建一个产品对象的各个部件指定的接口/抽象类
  • 具体建造者:实现接口,构建和装配各个部件。
  • 指挥者:构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

建造者模式盖房子类图

在这里插入图片描述

House.java

public class House{
    private String baise;
    private String wall;
    private String roofed;
    //省略getter和setter
}

HouseBuilder.java

//抽象的建造者
public abstract class HouseBuilder{
    protected House house=new House();
    //将建造的流程写好,抽象的方法
    public abstract void buildBasic();
    public abstract void buildWalls();
    public abasract void roofed();
    //建造房子后将产品返回
    public House buildHouse(){
        return house;
    }
}

CommonHouse.java

public class CommonHouse extends HouseBuilder{
    @Override
    public void buildBasic(){
        sout("普通房子打地基")
    }
    @Override
    public void buildWalls(){
        sout("普通房子砌墙")
    }
    @Override
    public void roofed(){
        sout("普通房子封顶")
    }
}

HouseDirector.java

public class HouseDirector{
    HouseBuilder houseBuilder=null;
    public HouseDirector(HouseBuilder houseBuilder){
        this.houseBuilder=houseBuilder;
    }
    //如何处理建造房子的流程,交给指挥者
    public House constructHouse(){
        houseBuilder.buildbasic();
        houseBuilder.buildWalls();
        houseBuilder.roofed();
        return houseBuilder.buildHouse();
    }
}

Client.java

 public class Client{
     main{
         CommonHouse commonHouse=new CommonHouse();
         HouseDirector houseDirector=new HouseDirector(commonHouse);
         House house=houseDirector.constructHouse();
     }
 }

适合的应用场景

  • 使用生成器模式可避免 重叠构造函数 telescopic constructor**” 的出现。**

  • 当你希望使用代码创建不同形式的产品 例如石头或木头房屋 **,** 可使用生成器模式**。**

  • 使用生成器模式可避免 重叠构造函数 telescopic constructor**” 的出现。**

  • 当你希望使用代码创建不同形式的产品 例如石头或木头房屋 **,** 可使用生成器模式**。**

  • 使用生成器构造组合树或其他复杂对象**。**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值