java设计模式之建造者模式

设计模式 专栏收录该内容
12 篇文章 0 订阅

前言

什么是建造者模式?

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

以盖房子为例,大致分为三部分:打地基、砌墙、封顶

传统模式:
在这里插入图片描述
AbstractHouse类

public abstract class AbstractHouse {

    //打地基
    public abstract void buildBasic();

    //砌墙
    public abstract void buildWalls();

    //封顶
    public abstract void roofed();

    //抽象类中,非抽象方法调用抽象方法(便于统一调用)
    public void build(){
        buildBasic();
        buildWalls();
        roofed();
    }
}

CommonHouse类

public class CommonHouse extends AbstractHouse {

    @Override
    public void buildBasic() {
        System.out.println("普通房子打地基");
    }

    @Override
    public void buildWalls() {
        System.out.println("普通房子砌墙");
    }

    @Override
    public void roofed() {
        System.out.println("普通房子封顶");
    }
}

Client类

public class Client {

    public static void main(String[] args) {
        CommonHouse commonHouse = new CommonHouse();
        commonHouse.build();
        //commonHouse.buildBasic();
    }
}

分析:

这种设计方案将产品(house)和创建产品的过程(建房子的流程)封装在一起了,耦合性增强了,从而引出了建造者模式来解决以上问题。

建造者模式

首先介绍建造者模式的四个角色:

  • Product(产品):一个具体的产品对象
  • Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类
  • ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件
  • Director(指挥者):构建一个使用Builder接口的对象,它主要是用于创建一个复杂的对象,主要有两个作用:
    ①隔离了客户与对象的生产过程
    ②负责控制产品对象的生产过程
    在这里插入图片描述
    HouseBuilder类
//抽象的建造者(Builder)
public abstract class HouseBuilder {

    //将产品Product(House)组合进来
    protected House house=new House();

    //将建造的流程写好,抽象方法
    public abstract void buildBasic();
    public abstract void buildWalls();
    public abstract void roofed();

    //建好房子后,将产品(House)返回
    public House buildHouse(){
        return house;
    }
}

HouseDirector类

//指挥者(Director),动态的指定制作流程
public class HouseDirector {

    //将HouseBuilder聚合进来(houseBuilder中是组合,实例化后,即为组合)
    HouseBuilder houseBuilder=null;

//构造器传入houseBuilder
    public HouseDirector(HouseBuilder houseBuilder){
        this.houseBuilder=houseBuilder;
    }

    //通过setter传入houseBuilder
    public void setHouseBuilder(HouseBuilder houseBuilder){
        this.houseBuilder=houseBuilder;
    }

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

House类

//产品,对应的四个角色中的Product
public class House {

    private String basic;
    private String wall;
    private String roofed;

    public String getBasic() {
        return basic;
    }

    public void setBasic(String basic) {
        this.basic = basic;
    }

    public String getWall() {
        return wall;
    }

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

    public String getRoofed() {
        return roofed;
    }

    public void setRoofed(String roofed) {
        this.roofed = roofed;
    }

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

CommonHouse类

//普通房子,具体建造者(ConcreteBuilder)
public class CommonHouse extends HouseBuilder {

    @Override
    public void buildBasic() {
        System.out.println("普通房子打地基");
    }

    @Override
    public void buildWalls() {
        System.out.println("普通房子砌墙");
    }

    @Override
    public void roofed() {
        System.out.println("普通房子封顶");
    }
}

HighBuilding类

//高楼,具体建造者(ConcreteBuilder)
public class HighBuilding extends HouseBuilder{

    @Override
    public void buildBasic() {
        System.out.println("高楼打地基");
    }

    @Override
    public void buildWalls() {
        System.out.println("高楼砌墙");
    }

    @Override
    public void roofed() {
        System.out.println("高楼封顶");
    }
}

Client类

public class Client {

    public static void main(String[] args) {
        //盖普通房子
        CommonHouse commonHouse=new CommonHouse();
        //准备创建房子的指挥者
        HouseDirector houseDirector=new HouseDirector(commonHouse);
        //完成盖房子的功能,返回产品(house)
        House house=houseDirector.constructHouse();


        //高楼
        HighBuilding highBuilding=new HighBuilding();
        //重置建造者
        houseDirector.setHouseBuilder(highBuilding);
        //完成盖高楼,返回产品(highbuilding)
        houseDirector.constructHouse();
    }
}
展开阅读全文
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值