Java设计模式——建造者模式

本文介绍了建造者模式在对象构建中的应用,通过对比传统方式与建造者模式,展示如何通过建造者模式降低代码耦合度,提高可维护性和扩展性。在实例中,展示了如何使用建造者模式来构建不同类型的房屋,包括产品类、抽象建造者、具体建造者和指挥者的角色设计,以及其实现代码。
摘要由CSDN通过智能技术生成

一、引入

1.1、例子

  • 建造不同的房子,例如高楼房、别墅、普通楼房。建造步骤是:打地基、垒墙、盖屋顶。

1.2、传统方法

  • 房子的抽象类
public abstract class AbstractHouse {
    
    public abstract void buildBase();
    public abstract void buildWalls();
    public abstract void roofer();
    
    public void build() {
        buildBase();
        buildWalls();
        roofer();
    }
}
  • 继承房子类,从而建造不同的房子
public class CommonHouse extends AbstractHouse{
    @Override
    public void buildBase() {
        System.out.println("开始打地基");
    }

    @Override
    public void buildWalls() {
        System.out.println("开始垒墙");
    }

    @Override
    public void roofer() {
        System.out.println("开始建屋顶");
    }
}
  • 开始建房子
public class Client {
    public static void main(String[] args) {
        CommonHouse house = new CommonHouse();
        house.build();
    }
}

1.3、传统方式分析

  • 优点是简单好理解、容易操作。
  • 设计的结构过于简单,没有设计缓存层对象,程序的扩展性和可维护性不好。也就是说,这种方式没有将房子对象和建造房子的过程进行分离,使得程序的耦合性很高。

二、建造者模式

2.1、基本介绍

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

2.2、建造者模式的四个角色

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

2.3、 使用建造者模式盖房

2.3.1、类图设计

在这里插入图片描述

2.3.1、代码实现

  • 产品类
public class Home {
    private String base;
    private String walls;
    private String footer;

    public String getBase() {
        return base;
    }

    public void setBase(String base) {
        this.base = base;
    }

    public String getWalls() {
        return walls;
    }

    public void setWalls(String walls) {
        this.walls = walls;
    }

    public String getFooter() {
        return footer;
    }

    public void setFooter(String footer) {
        this.footer = footer;
    }

    @Override
    public String toString() {
        return "Home{" +
                "base='" + base + '\'' +
                ", walls='" + walls + '\'' +
                ", footer='" + footer + '\'' +
                '}';
    }
}
  • 抽象建造者
public abstract class AbstractBuilder {
    public Home home = new Home();

    public abstract void buildBase();
    public abstract void buildWalls();
    public abstract void footer();

    public Home build() {
        return this.home;
    }

}
  • 具体建造者
public class CommonHome extends AbstractBuilder {

    @Override
    public void buildBase() {
        home.setBase("普通地基");
        System.out.println("地基5米");
    }

    @Override
    public void buildWalls() {
        home.setWalls("普通墙");
        System.out.println("红色墙");
    }

    @Override
    public void footer() {
        home.setFooter("普通屋顶");
        System.out.println("盖屋顶");
    }
}
  • 指挥者
public class HomeDirector {
    AbstractBuilder ab;

    public HomeDirector(AbstractBuilder ab) {
        this.ab = ab;
    }

    public void setAb(AbstractBuilder ab) {
        this.ab = ab;
    }

    public Home builder() {
        ab.buildBase();
        ab.buildWalls();
        ab.footer();

        return ab.build();
    }
}
  • 开始建造房屋
public class Client {
    public static void main(String[] args) {
        CommonHome commonHome = new CommonHome();

        HomeDirector director = new HomeDirector(commonHome);
        Home home = director.builder();
        System.out.println(home);
    }
}
  • 如果,被建造的对象只有一种,那么则可以使用传统的方式替代建造者模式,那样做会更方便
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值