目录
1.提出问题
2.什么是建造者模式?
3.案例代码
3.JDK中的建造者模式
4.建造者模式总结
首页 Java java教程 Java建造者模式是什么

Java建造者模式是什么

May 02, 2023 pm 12:04 PM
java

1.提出问题

假如说,我们需要建房子:这一过程为打桩、砌墙、封顶。房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的.3)请编写程序,完成需求。

传统的想法应该就是下面这个类图的形式。.

Java建造者模式是什么

那么这种写法的优点就是 比较好理解,简单易操作。

缺点则是:设计的程序结构,过于简单,没有设计缓存层对象,程序的扩展和维护不好。也就是说,这种设计方案,把产品(即: 房子)和创建产品的过程(即: 建房子流程)封装在一起,耦合性增强了。

解决方案:  将产品和产品建造过程解耦  =>  建造者模式。

2.什么是建造者模式?

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

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

而在建造者模式中有四大角色:

  • Product(产品角色):  一个具体的产品对象。

  • Builder(抽象建造者):  创建一个Product对象的各个部件指定的接口/抽象类。

  • ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件。

  • Director(指挥者):  构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:  隔离了客户与对象的生产过程,二是:  负责控制产品对象的生产过程。

3.案例代码

如果说将上面盖房子的案例使用建造者模式来解决了话,那么类图就是下面这样。(四大角色都在其中),House类就是具体的产品(我们要盖的房子实体),HouseBuilder则是抽象建造者,具体的建造过程不在它内部实现,而是由它下面的几个子类来完成,这几个子类就是具体建造者(CommonHouse、HighBuilding),指挥者则是HouseDirector,它来负责产品对象的建造过程(我到底要建造哪种类型的房子)。最后的Client则是我们的测试类。

Java建造者模式是什么

package com.szh.builder;
 
public class House {
    private String basic;
    private String wall;
    private String roof;
 
    //setter and getter
}
登录后复制
package com.szh.builder;
 
//抽象的建造者
public abstract class HouseBuilder {
 
    protected House house = new House();
 
    //将建造的流程写好, 抽象的方法
    public abstract void buildBasic();
    public abstract void buildWall();
    public abstract void buildRoof();
 
    //建造房子好, 将产品(房子)返回
    public House buildHouse() {
        return house;
    }
 
}
登录后复制
package com.szh.builder;
 
public class CommonHouse extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println(" 普通房子打地基5m.... ");
    }
 
    @Override
    public void buildWall() {
        System.out.println(" 普通房子砌墙10cm.... ");
    }
 
    @Override
    public void buildRoof() {
        System.out.println(" 普通房子添加屋顶.... ");
    }
}
登录后复制
package com.szh.builder;
 
public class HighHouse extends HouseBuilder {
    @Override
    public void buildBasic() {
        System.out.println(" 高楼打地基100m.... ");
    }
 
    @Override
    public void buildWall() {
        System.out.println(" 高楼砌墙20cm.... ");
    }
 
    @Override
    public void buildRoof() {
        System.out.println(" 高楼添加透明屋顶.... ");
    }
}
登录后复制
package com.szh.builder;
 
//指挥者,这里去指定制作流程,返回产品
public class HouseDirector {
 
    HouseBuilder houseBuilder;
 
    //构造器传入 houseBuilder
    public HouseDirector(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }
 
    //通过setter传入 houseBuilder
    public void setHouseBuilder(HouseBuilder houseBuilder) {
        this.houseBuilder = houseBuilder;
    }
 
    //如何处理建造房子的流程,交给指挥者
    public House constructHouse() {
        houseBuilder.buildBasic();
        houseBuilder.buildWall();
        houseBuilder.buildRoof();
        return houseBuilder.buildHouse();
    }
}
登录后复制
package com.szh.builder;
 
public class MainTest {
    public static void main(String[] args) {
        //盖普通房子
        CommonHouse commonHouse = new CommonHouse();
        //准备创建房子的指挥者
        HouseDirector houseDirector = new HouseDirector(commonHouse);
        //完成盖房子,返回产品(普通房子)
        houseDirector.constructHouse();
 
        System.out.println("--------------------------");
 
        //盖高楼
        HighHouse highHouse = new HighHouse();
        //重置建造者
        houseDirector.setHouseBuilder(highHouse);
        //完成盖房子,返回产品(高楼)
        houseDirector.constructHouse();
    }
}
登录后复制

Java建造者模式是什么

3.JDK中的建造者模式

我们来看StringBuilder这个类,以及它的父类,父类实现的相关接口。

Java建造者模式是什么

Java建造者模式是什么

Java建造者模式是什么

  • Appendable接口定义了多个append方法(抽象方法),即Appendable为抽象建造者,定义了抽象方法。

  • AbstractStringBuilder实现了Appendable接口方法,这里的 AbstractStringBuilder已经是建造者,只是不能实例化。

  • StringBuilder即充当了指挥者角色,同时充当了具体的建造者,建造方法的实现是由AbstractStringBuilder 完成,而 StringBuilder 继承了AbstractStringBuilder。

4.建造者模式总结

  • 客户端(使用程序)不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

  • 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。

  • 可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

  • 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。

  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,因此在这种情况下,要考虑是否选择建造者模式。

  • 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。

以上是Java建造者模式是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP与Python:了解差异 PHP与Python:了解差异 Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

突破或从Java 8流返回? 突破或从Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

PHP与其他语言:比较 PHP与其他语言:比较 Apr 13, 2025 am 12:19 AM

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP与Python:核心功能 PHP与Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有优势,适合不同场景。1.PHP适用于web开发,提供内置web服务器和丰富函数库。2.Python适合数据科学和机器学习,语法简洁且有强大标准库。选择时应根据项目需求决定。

PHP的影响:网络开发及以后 PHP的影响:网络开发及以后 Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP:许多网站的基础 PHP:许多网站的基础 Apr 13, 2025 am 12:07 AM

PHP成为许多网站首选技术栈的原因包括其易用性、强大社区支持和广泛应用。1)易于学习和使用,适合初学者。2)拥有庞大的开发者社区,资源丰富。3)广泛应用于WordPress、Drupal等平台。4)与Web服务器紧密集成,简化开发部署。

PHP与Python:用例和应用程序 PHP与Python:用例和应用程序 Apr 17, 2025 am 12:23 AM

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。

See all articles