我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java设计模式--建造者模式详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java设计模式--建造者模式详解

引例

需求:建造房子,建造过程包括打地基、砌墙和封顶。房子各式各样,包括平房和别墅,编程模拟实现。

一般解法

思路:定义房子类,包括建房的方法,然后定义平房和别墅继承房子类,重写相关方法。

类图:

在这里插入图片描述

代码:

AbstractHouse(房子)


public abstract class AbstractHouse {
    public abstract void buildBasic();//打地基
    public abstract void buildWalls();//砌墙
    public abstract void buildRoof();//封顶
    public void build() { //建房
       buildBasic();  //三个步骤(注意顺序)
       buildWalls();
       buildRoof();
    }
}

Bungalow(平房)


public class Bungalow extends AbstractHouse{
    @Override
    public void buildBasic() {
        System.out.println("平房打地基");
    }
    @Override
    public void buildWalls() {
        System.out.println("平房砌墙");
    }
    @Override
    public void buildRoof() {
        System.out.println("平房封顶");
    }
}

Villa (别墅)


public class Villa extends AbstractHouse{
    @Override
    public void buildBasic() {
        System.out.println("别墅打地基");
    }
    @Override
    public void buildWalls() {
        System.out.println("别墅砌墙");
    }
    @Override
    public void buildRoof() {
        System.out.println("别墅封顶");
    }
}

客户端调用


public class Client {
    public static void main(String[] args) {
        Bungalow bungalow = new Bungalow();
        bungalow.build();
        Villa villa = new Villa();
        villa.build();
    }
}

运行结果:

在这里插入图片描述

缺点:

程序不好扩展和维护,把产品和创建产品过程封装在一起,耦合性高。

解耦产品和创建产品过程=》建造者模式

建造者模式

建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

一步一步创建一个复杂的对象,允许用户只通过指定复杂对象的类型和内容就可以构建它们,而不需要知道内部的具体构建细节。

类图:

在这里插入图片描述

  • Product(产品): 具体的产品对象
  • Builder(抽象建造者): 创建一个产品对象的各个部件指定的接口/抽象类。
  • ConcreteBuilder(具体建造者): 实现接口,构建和装配各个部件。
  • Director(指挥者): 构建一个使用Builder接口的对象,负责控制产品对象的生产过程,隔离了客户与对象的生产过程。

建造者模式解法

代码:

House类(Product产品)


public class House {
    private String baise;
    private String wall;
    private String roof;
}

HouseBuilder类(Builder抽象建造者)


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

3.Bungalow类(ConcreteBuilder具体建造者A)


public class Bungalow extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println("平房打地基");
    }
    @Override
    public void buildWalls() {
        System.out.println("平房砌墙");
    }
    @Override
    public void buildRoof() {
        System.out.println("平房封顶");
    }
}

4.Villa类(ConcreteBuilder具体建造者B)


public class Villa extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println("别墅打地基");
    }
    @Override
    public void buildWalls() {
        System.out.println("别墅砌墙");
    }
    @Override
    public void buildRoof() {
        System.out.println("别墅封顶");
    }
}

5.HouseDirector类(Director指挥者)


public class HouseDirector {
    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.buildRoof();
        return houseBuilder.buildHouse();
    }
}

客户端调用


public class Client {
    public static void main(String[] args) {
        //盖平房
        Bungalow commonHouse = new Bungalow();
        //准备创建房子的指挥者
        HouseDirector houseDirector = new HouseDirector(commonHouse);
        //完成盖房子,返回产品(普通房子)
        House house = houseDirector.constructHouse();
        System.out.println("--------------------------");
        //盖别墅
        Villa highBuilding = new Villa();
        //重置建造者
        houseDirector.setHouseBuilder(highBuilding);
        //完成盖房子,返回产品(高楼)
        houseDirector.constructHouse();
    }
}

运行结果:

在这里插入图片描述

总结

  • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  • 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰。
  • 使用不同的具体建造者即可得到不同的产品对象。
  • 增加新的具体建造者无须修改原有代码。
  • 若产品间的差异很大,则不适合使用建造者模式。
  • 抽象工厂模式VS建造者模式

抽象工厂模式是对产品家族的创建,一个产品家族是一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。

而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java设计模式--建造者模式详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java创建型设计模式之建造者模式详解

建造者模式是Java中一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程分解为多个简单对象的构建过程,本文将详细介绍Java中的建造者模式,包括它的定义、结构、实现方法以及应用场景等方面,希望对大家有所帮助
2023-05-19

Java设计模式之建造者模式实例详解

本文实例讲述了Java设计模式之建造者模式。分享给大家供大家参考,具体如下:建造者模式(builder)可以将部件和其组装过程分开.一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节.什
2023-05-31

设计模式之建造者模式

文章目录 盖房项目需求传统方式解决盖房需求传统方式的问题分析建造者模式概述是建造者模式的四个角色建造者模式原理类图建造者模式的注意事项和细节 盖房项目需求 需要建房子:这一过程为打桩、砌墙、封顶房子有各种各样的,比如普通房,高楼
2023-08-30

怎么理解Java设计模式的建造者模式

本篇内容介绍了“怎么理解Java设计模式的建造者模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是建造者模式建造者模式也称生成器模
2023-06-25

Java设计模式的建造者模式是什么

这篇文章主要介绍了Java设计模式的建造者模式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式的建造者模式是什么文章都会有所收获,下面我们一起来看看吧。1、什么是建造者模式?我们知道在软件开
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录