java中建造者模式和模版模式的区别?可以用代码实例说明

建造者模式(Builder Pattern)和模板模式(Template Pattern)在Java中都是行为设计模式,但它们的用途和目的有所不同。以下是两者的主要区别,并通过代码实例来说明。

建造者模式(Builder Pattern)
建造者模式主要用于构建复杂对象的表示,并将构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。该模式允许你通过简单的方法来创建具有复杂内部结构的对象。

代码实例
java
// 产品接口  
public interface Car {  
    void setEngine(String engine);  
    void setWheels(int wheels);  
    void setBody(String body);  
    // ... 其他设置方法  
  
    void display();  
}  
  
// 具体的产品实现  
public class ConcreteCar implements Car {  
    private String engine;  
    private int wheels;  
    private String body;  
    // ... 其他属性  
  
    // 省略getter和setter  
  
    @Override  
    public void display() {  
        System.out.println("Car Details:");  
        System.out.println("Engine: " + engine);  
        System.out.println("Wheels: " + wheels);  
        System.out.println("Body: " + body);  
        // ... 输出其他属性  
    }  
}  
  
// 建造者接口  
public interface CarBuilder {  
    CarBuilder setEngine(String engine);  
    CarBuilder setWheels(int wheels);  
    CarBuilder setBody(String body);  
    // ... 其他设置方法  
  
    Car build();  
}  
  
// 具体的建造者实现  
public class ConcreteCarBuilder implements CarBuilder {  
    private ConcreteCar car = new ConcreteCar();  
  
    @Override  
    public CarBuilder setEngine(String engine) {  
        car.setEngine(engine);  
        return this; // 链式调用  
    }  
  
    // ... 其他实现  
  
    @Override  
    public Car build() {  
        return car;  
    }  
}  
  
// 使用示例  
public class Client {  
    public static void main(String[] args) {  
        CarBuilder builder = new ConcreteCarBuilder();  
        Car car = builder.setEngine("V8")  
                         .setWheels(4)  
                         .setBody("Sedan")  
                         .build();  
        car.display();  
    }  
}
模板模式(Template Pattern)
模板模式定义了一个操作中的算法的框架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

代码实例
java
// 抽象类定义模板  
public abstract class AbstractClass {  
    public final void templateMethod() {  
        specificMethod1();  
        specificMethod2();  
        // ... 其他方法调用  
  
        hook(); // 钩子方法,可选实现  
    }  
  
    protected abstract void specificMethod1();  
    protected abstract void specificMethod2();  
  
    // 钩子方法,子类可以选择实现  
    protected void hook() {  
        // 默认实现为空  
    }  
}  
  
// 具体子类实现模板中的抽象方法  
public class ConcreteClass extends AbstractClass {  
    @Override  
    protected void specificMethod1() {  
        System.out.println("ConcreteClass implements specificMethod1");  
    }  
  
    @Override  
    protected void specificMethod2() {  
        System.out.println("ConcreteClass implements specificMethod2");  
    }  
  
    // 可以选择覆盖钩子方法  
    @Override  
    protected void hook() {  
        System.out.println("ConcreteClass overrides hook");  
    }  
}  
  
// 使用示例  
public class Client {  
    public static void main(String[] args) {  
        AbstractClass obj = new ConcreteClass();  
        obj.templateMethod(); // 调用模板方法,会按照定义的顺序调用各个方法  
    }  
}
通过上面的代码实例,我们可以看到两种模式的主要区别:

建造者模式关注的是复杂对象的构建过程,并提供了构建步骤的封装和复用;而模板模式关注的是算法框架的定义,允许子类在不改变算法结构的情况下重定义某些步骤。
建造者模式通常用于创建对象,而模板模式通常用于定义算法或操作过程。
建造者模式中的建造者接口和具体建造者类是可扩展的,可以根据需要添加新的构建步骤;而模板模式中的抽象类和具体子类通常更加稳定,不容易频繁变动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/834499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双展联动—第四届中国跨境电商及新电商交易博览会强势来袭

双展联动产业升级 ——第四届中国跨境电商及新电商交易博览会强势来袭 万商云集有福之州,掘金万亿蓝海市场。备受瞩目的“第四届中国跨境电商及新电商交易博览会暨2024中国户外生活及休闲运动用品交易博览会”将于2024年9月21-23日在福建福州海峡国际会展中心盛大召…

【数据库】存储过程、函数、触发器

按照要求实现员工管理数据库系统中的指定操作:1、创建一个数据库 staff,并在数据库中创建以下四张表: 员工表 employee(员工编号id,姓名userName,出生日期birthDate,身份证号idCard,登录名称loginName,登录密码password,手机号mo…

基于Vite创建项目

1.npm设置镜像源为国内淘宝源 npm config set registry https://registry.npmmirror.com 2.vite官方中文文档 Vite | 下一代的前端工具链 3.创建项目 npm create vitelatest my-app 接下来按照提示操作就可以,最后 npm run dev 就可以启动项目了 4.安装依赖 …

接口性能测试 —— Jmeter并发与持续性压测!

接口压测的方式: 1、同时并发:设置线程组、执行时间、循环次数,这种方式可以控制接口请求的次数 2、持续压测:设置线程组、循环次数,勾选“永远”,调度器(持续时间),这种…

汽车电子零部件(13):BMS电池管理系统

前言: 电池管理系统(BMS)确保电动汽车(EV)的能量分配安全高效。目前流行电动汽车中使用的有四种主要BMS架构,BMS与充电基础设施互为集成关系。BMS主要管理 的是电池组,电池组由很多电芯组成,比如下图是H/EV电池组的主要部件,显示了电池、连接、控制电路和包装的总体布…

软件技术主要学什么课程

软件技术专业主要学习的课程和内容有编程语言、数据结构与算法、数据库技术等,以下是上大学网( www.sdaxue.com)整理的软件技术主要学什么课程,供大家参考! 编程语言:掌握一种或多种编程语言,如C#、Java、Python、C等&…

MySQL中的事务隔离级别

事务隔离级别 未提交读(Read uncommitted)是最低的隔离级别。通过名字我们就可以知道,在这种事务隔离级别下,一个事务可以读到另外一个事务未提交的数据。这种隔离级别下会存在幻读、不可重复读和脏读的问题。提交读(Read committed)也可以翻译成读已提交…

线程池与线程池参数策略

文章目录 线程池案例参数说明取值策略 线程池 使用一个线程池用于维护线程,可以避免频繁的进行线程创建与销毁造成的浪费。需要使用线程的时候从线程池中取出就可以了。 案例 public class ExecutorDemo {public static void main(String[] args) {int corePoolS…

Qt——HighLight篇

用HighLight绘制高亮按钮,之前有一篇讲述绘制pushButton按钮颜色的QpushButton绘制圆角矩形并绘制背景颜色-CSDN博客,这个是扩展,另一种实现方案。 想要将按钮的背景颜色设置为 Qt 的高亮显示颜色。可以使用 QPalette::Highlight 来获取 Qt 的…

PyCharm安装教程(超详细图文教程)

一、下载和安装 1.进入PyCharm官方下载,官网下载地址: https://www.jetbrains.com/pycharm/download/ 专业版安装插件放网盘了,网盘下载即可:itcxy.xyz/229.html2.安装 1.下载后找到PyCharm安装包,然后双击双击.ex…

es使用遇到的bug总结

本来版本7.4.0不行,最后换了个版本7.15.1就可以了,但又出现以下问题了: Beanpublic ElasticsearchClient elasticsearchClient() { // RestClient client RestClient.builder(new HttpHost("localhost", 9200,"http&q…

Paddle 基于ANN(全连接神经网络)的GAN(生成对抗网络)实现

什么是GAN GAN是生成对抗网络,将会根据一个随机向量,实现数据的生成(如生成手写数字、生成文本等)。 GAN的训练过程中,需要有一个生成器G和一个鉴别器D. 生成器用于生成数据,鉴定器用于鉴定数据的准确性&…

通过Docker Compose部署GitLab和GitLab Runner(一)

GitLab 是一个用于版本控制、项目管理和持续集成的开源软件平台,它提供了一整套工具,能够帮助团队高效地协作开发。而 GitLab Runner 则是 GitLab CI/CD 的执行者,用于运行持续集成和持续交付任务。 在本文中,我们将使用 Docker …

实现C++ Vector

手写C Vector&#xff0c;参考QVector 类声明 template<typename T >class IteratorVector;template<typename T >class IteratorVectorConst;template<typename T >class Vector final :public ContainerBase{public:explicit Vector()noexcept;explicit V…

【SpringBoot】-- 监听容器事件、Bean的前后置事件

目录 一、ApplicationContextInitializer 使用 1、自定义类&#xff0c;实现ApplicationContextInitializer接口 2、在META-INF/spring.factories配置文件中配置自定义类 二、ApplicationListener 使用 1、自定义类&#xff0c;实现ApplicationListener接口 2、在META-…

Selenium 自动化 —— 常用的定位器(Locator)

什么是定位器 定位器&#xff08;Locator&#xff09;是识别DOM中一个或多个特定元素的方法。 也可以叫选择器 Selenium 通过By类&#xff0c;提供了常见的定位器。具体语法如下&#xff1a; By.xxx("");我们选择单个元素时可以使用findByElement&#xff1a; Web…

三.Django--ORM(操作数据库)

目录 1 什么是ORM 1.1 ORM优势 1.2ORM 劣势 1.3 ORM与数据库的关系 2 ORM 2.1 作用 2.2 连接数据库 2.3 表操作--设置字段 2.4 数据库的迁移 写路由增删改查操作 项目里的urls.py: app里的views.py: 注意点: 1 什么是ORM ORM中文---对象-关系映射 在MTV,MVC设计…

【思考讨论】如何利用AI提高内容生产效率?

1. 自动化内容生成 利用人工智能&#xff08;AI&#xff09;提高内容生产效率&#xff0c;尤其是在自动化内容生成方面&#xff0c;已经成为媒体、营销、教育等多个领域的热门话题。随着自然语言处理&#xff08;NLP&#xff09;、机器学习、深度学习等技术的飞速发展&#xf…

Android 的 Timer 和 TimerTask

Timer 简介(来自Gemini) Timer 是 Java 中用于创建定时任务的类。它位于 java.util 包中。可以使用 Timer 来安排一次性或定期执行的任务。 每个 Timer 对象都对应一个后台线程。此线程负责从任务队列中检索任务并按计划执行它们。 使用 Timer 要使用 Timer&#xff0c;首先…

政安晨:【Keras机器学习示例演绎】(三十九)—— 使用 FNet 进行文本分类

目录 简介 模型 设置 加载数据集 对数据进行标记 格式化数据集 建立模型 训练我们的模型 与变换器模型比较 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&…