iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >设计模式系列之如何使用建造者模式
  • 715
分享到

设计模式系列之如何使用建造者模式

2024-04-02 19:04:59 715人浏览 泡泡鱼
摘要

这篇文章主要讲解了“设计模式系列之如何使用建造者模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“设计模式系列之如何使用建造者模式”吧! 1、概述

这篇文章主要讲解了“设计模式系列之如何使用建造者模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“设计模式系列之如何使用建造者模式”吧!

 1、概述

建造者模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象。

2、适用场景

1)避免重叠构造函数,例如:一个类有很多的属性,这时候的构造方法需要传递很多的参数,为了避免这样,会重新写一个相对参数较少的构造方法,但是仍然需要对其他参数进行赋默认值。

2)当需要创建不同的产品类型,此处指比较接近的产品类型,则可以在顶层builder中包含大部分产品属性的赋值方法。

3、实例

有以下场景,我们分别使用常规方式和建造者模式实现:

当前有一个汽车工厂,可以生产的汽车类型有ordinary,sport。 除了汽车之外,同样可以生产汽车的操作手册manual。 汽车有以下的属性: 1、type 类型 2、seats 座位数 3、engine 引擎 4、GPS 导航  分别实现汽车和手册的生产过程

不使用建造者模式

分别创建车car和手册manual,以及其内部的属性,当前例子中车和手册是相同的属性。

@Data public class Car {      private CarType type;      private int seats;      private Engine engine;      private GPS GPS;      public Car(CarType type, int seats, Engine engine, com.cloud.bssp.designpatterns.builder.withouttdesign.entity.GPS GPS) {         this.type = type;         this.seats = seats;         this.engine = engine;         this.GPS = GPS;     }      public void detail() {         System.out.println("this is " + type + " car");         System.out.println("the seats is :" + seats);         System.out.println("the engine is :" + engine);         System.out.println("this GPS is :" + GPS);     } }
@Data public class Manual {      private CarType type;      private int seats;      private Engine engine;      private GPS GPS;      public Manual(CarType type, int seats, Engine engine, com.cloud.bssp.designpatterns.builder.withouttdesign.entity.GPS GPS) {         this.type = type;         this.seats = seats;         this.engine = engine;         this.GPS = GPS;     }      public void detail() {         System.out.println("this is " + type + " car");         System.out.println("the seats is :" + seats);         System.out.println("the engine is :" + engine);         System.out.println("this GPS is :" + GPS);     } }
public enum CarType {     SPORT,ORDINARY; }
 @Data public class Engine {           private final double volume;          private double mileage;      public Engine(double volume, double mileage) {         this.volume = volume;         this.mileage = mileage;     } }
@Data public class GPS {          private String route;      public GPS(String route) {         this.route = route;     } }

测试类:

 @RunWith(springRunner.class) @SpringBootTest(classes = TestApplication.class) public class TestDemo {      @Test     public void test() {         //生产跑车         Car sportCar = new Car(                 CarType.SPORT,                 2,                 new Engine(3.0, 0),                 new GPS("上海东方明珠塔到上海动物园")         );         sportCar.detail();         System.out.println("----------------------------------------");         //生产普通汽车         Car ordinaryCar = new Car(                 CarType.ORDINARY,                 4,                 new Engine(2.0, 0),                 new GPS("上海东方明珠塔到上海动物园")         );         ordinaryCar.detail();         System.out.println("----------------------------------------");         //生产汽车操作手册         Manual manual = new Manual(                 CarType.ORDINARY,                 4,                 new Engine(2.0, 0),                 new GPS("上海东方明珠塔到上海动物园")         );         manual.detail();         System.out.println("----------------------------------------");     } }

结果:

this is SPORT car the seats is :2 the engine is :Engine(volume=3.0, mileage=0.0) this GPS is :GPS(route=上海东方明珠塔到上海动物园) ---------------------------------------- this is ORDINARY car the seats is :4 the engine is :Engine(volume=2.0, mileage=0.0) this GPS is :GPS(route=上海东方明珠塔到上海动物园) ---------------------------------------- this is ORDINARY car the seats is :4 the engine is :Engine(volume=2.0, mileage=0.0) this GPS is :GPS(route=上海东方明珠塔到上海动物园) ----------------------------------------

使用建造者模式实现

使用建造者模式后,代码要比上面的方法多了不少:

设计模式系列之如何使用建造者模式

创建顶层Builder

public interface Builder {      void setCarType(CarType carType);      void setSeats(int seats);      void setEngine(Engine engine);      void setGPS(GPS gps); }

创建实体类,与上面是相同的,这里不重复了。

创建car的builder:

@Data public class CarBuilder implements Builder {      private CarType carType;      private int seats;      private Engine engine;      private GPS GPS;      public Car getResult() {         return new Car(carType, seats, engine, GPS);     } }

创建汽车操作手册builder:

@Data public class ManualBuilder implements Builder {      private CarType carType;      private int seats;      private Engine engine;      private GPS GPS;      public Manual getResult() {         return new Manual(carType, seats, engine, GPS);     } }

创建一个builder管理器:

public class Director {      public void constructSportsCar(Builder builder) {         builder.setCarType(CarType.SPORT);         builder.setSeats(2);         builder.setEngine(new Engine(3.0, 0));         builder.setGPS(new GPS("上海东方明珠塔到上海动物园"));     }      public void constructOrdinaryCar(Builder builder) {         builder.setCarType(CarType.ORDINARY);         builder.setSeats(4);         builder.setEngine(new Engine(2.0, 0));         builder.setGPS(new GPS("上海东方明珠塔到上海动物园"));     } }

测试类:

@RunWith(SpringRunner.class) @SpringBootTest(classes = TestApplication.class) public class TestDemo {      @Test     public void test() {         Director director = new Director();         //生产跑车         CarBuilder carBuilder = new CarBuilder();         director.constructSportsCar(carBuilder);         Car sportCar = carBuilder.getResult();         sportCar.detail();         System.out.println("-----------------------------------");          //生产普通汽车         director.constructOrdinaryCar(carBuilder);         Car ordinaryCar = carBuilder.getResult();         ordinaryCar.detail();         System.out.println("-----------------------------------");          //生产汽车操作手册         ManualBuilder manualBuilder = new ManualBuilder();         director.constructOrdinaryCar(manualBuilder);         Manual manual = manualBuilder.getResult();         manual.detail();         System.out.println("-----------------------------------");     } }

结果:

this is SPORT car the seats is :2 the engine is :Engine(volume=3.0, mileage=0.0) this GPS is :GPS(route=上海东方明珠塔到上海动物园) ----------------------------------- this is ORDINARY car the seats is :4 the engine is :Engine(volume=2.0, mileage=0.0) this GPS is :GPS(route=上海东方明珠塔到上海动物园) ----------------------------------- this Manual ORDINARY car the Manual seats is :4 the Manual engine is :Engine(volume=2.0, mileage=0.0) this GManual PS is :GPS(route=上海东方明珠塔到上海动物园) -----------------------------------

4、分析

建造者模式基本有以下几个角色:

设计模式系列之如何使用建造者模式

如上面两种方式的结果显示,都可以实现生产汽车和汽车手册。

结果没什么差异。

在没使用建造者的方式中:

生产汽车的参数是由客户端自己指定的,并且需要传很多的参数,实际工作中可能需要更多的参数,可能有部分参数是不需要的。

使用建造者模式

用户不需要去具体指定多个参数了,对于客户端更友好。

builder:将产品new()提出到builder中,提供产品所拥有的属性设置方法,一类产品都可以使用这个builder进行产品创建。

director:作为builder的管理者,主要控制产品的属性设置,在这个类中,具体指定除了可以生产的产品的构造,并且对属性进行赋值,最终返回一个用户需要的builder。

客户端调用只需要创建需要的产品类型builder,通过管理者director对builder进行属性设置,最终客户端通过调用builder的方法获取最终需要的产品。

极大程度减少并优化的客户端的代码,同时由管理者director限制了产品的种类。

从扩展层层面看:

未使用建造者:增加对应的产品类,客户端直接new。

使用建造者模式:增加builder,并且在director增加可创建的产品的builder构造。

5、总结

最后总结下上面例子中使用抽象工厂方法的优缺点:

优点:

1)遵守单一原则。

2)不同产品,可复用相同的产品创建流程。

3)简化客户端调用方式。去除多参构造的方式。

4)分步骤创建对象。

缺点:

增加多个类,代码复杂度增加。

感谢各位的阅读,以上就是“设计模式系列之如何使用建造者模式”的内容了,经过本文的学习后,相信大家对设计模式系列之如何使用建造者模式这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 设计模式系列之如何使用建造者模式

本文链接: https://www.lsjlt.com/news/83987.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 设计模式系列之如何使用建造者模式
    这篇文章主要讲解了“设计模式系列之如何使用建造者模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“设计模式系列之如何使用建造者模式”吧! 1、概述...
    99+
    2024-04-02
  • 设计模式之建造者模式
    文章目录 盖房项目需求传统方式解决盖房需求传统方式的问题分析建造者模式概述是建造者模式的四个角色建造者模式原理类图建造者模式的注意事项和细节 盖房项目需求 需要建房子:这一过程为打桩、砌墙、封顶房子有各种各样的,比如普通房,高楼...
    99+
    2023-08-30
    设计模式
  • C#设计模式之建造者模式
    场景:我们的冒险家,现在需要去武器商店买一把兵器,有刀和剑两种武器,冒险者可以告诉武器商人需要哪一种武器,然后武器商人进行锻造,最后把产品给冒险者,用建造者模式如何实现? 1.什么是...
    99+
    2024-04-02
  • Java设计模式之建造者模式
    本文由老王家组装电脑引出——建造者设计模式,详细介绍建造者模式的基本概念和实现代码,为了便于理解建造者模式,我们会对实际应用中的典型案例进行介绍。最后对比工厂...
    99+
    2024-04-02
  • Java通俗易懂系列设计模式之建造者模式
    目录介绍意图定义实例使用场景JDK中的Builder设计模式示例总结介绍 今天我们将研究java中的Builder模式。Builder 设计模式是一种创造性的设计模式,如工厂模式和抽...
    99+
    2024-04-02
  • java设计模式:建造者模式之生产线
    目录什么是建造者模式建造者模式中的角色产品角色(Product)抽象建造者(Builder)具体建造者角色(ConcreteBuilder)导演者角色(Director)最终测试总结...
    99+
    2024-04-02
  • Java创建型设计模式之建造者模式详解
    目录前言定义结构实现方法应用场景总结建造者模式是Java中一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程分解为多个简单对象的构建过程,并且使这些构建过程按照一定的顺序进行...
    99+
    2023-05-19
    Java建造者模式 Java建造者模式实践 Java创建型设计模式
  • 如何使用设计模式系列之单例模式
    这篇文章主要介绍“如何使用设计模式系列之单例模式”,在日常操作中,相信很多人在如何使用设计模式系列之单例模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用设计模式系列...
    99+
    2024-04-02
  • 深入理解Java设计模式之建造者模式
    目录一、什么是建造者模式二、建造者模式的应用场景三、建造者模式的优缺点四、工厂模式和建造者模式的对比五、建造者模式的实现六、总结一、什么是建造者模式 建造者模式也称生成器模式 定义:...
    99+
    2024-04-02
  • Java设计模式之建造者模式实例详解
    本文实例讲述了Java设计模式之建造者模式。分享给大家供大家参考,具体如下:建造者模式(builder)可以将部件和其组装过程分开.一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节.什...
    99+
    2023-05-31
    java 设计模式 建造者模式
  • JAVA设计模式----建造者模式详解
    目录介绍角色代码演示通过反射创建建造者对象优点缺点适用场景总结介绍 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的...
    99+
    2024-04-02
  • java设计模式--建造者模式详解
    目录引例一般解法代码:AbstractHouse(房子)Bungalow(平房)Villa (别墅)客户端调用建造者模式建造者模式解法代码:House类(Product产品)Hous...
    99+
    2024-04-02
  • Java中常用的设计模式之建造者模式详解
    目录优点缺点使用场景一、实现方式二、实现方式1、引入依赖2、实现三、测试总结优点 1.建造者独立,易扩展。 2.便于控制细节风险。 缺点 1.产品必须有共同点,范围有限制。 2.如内...
    99+
    2024-04-02
  • Java设计模式之建造者模式的示例详解
    目录定义案例需求方案一方案二对比分析总结建造者模式的优势:注意点 定义 建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽...
    99+
    2024-04-02
  • Java 深入理解创建型设计模式之建造者模式
    1.提出问题 假如说,我们需要建房子:这一过程为打桩、砌墙、封顶。房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的.3)请编写程序,完成需求。 传...
    99+
    2024-04-02
  • .Net创建型设计模式之建造者、生成器模式(Builder)
    目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)四、模式的组成五、建筑者模式的具体实现六、建造者模式的实现要点1、建造者模式的优点:2、建造...
    99+
    2024-04-02
  • 如何使用建造者模式
    本篇内容介绍了“如何使用建造者模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1使用场景在阅读源码过程中...
    99+
    2024-04-02
  • 学习设计模式之建造者模式,但是宝可梦
    前言 作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 建造者模式 建造者模式是一种创建型模式,主要针对于某一个类有特别繁杂的属性,并且这些属性中有部分不是必须的。 避免在创建对象时,需要众多的构造函数,就有...
    99+
    2023-08-30
    设计模式 建造者模式
  • Python 设计模式中的创建型建造者模式
    目录一、建造者模式二、代码示例一、建造者模式 建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 => 装修)...
    99+
    2024-04-02
  • 理解JavaScript设计模式中的建造者模式
    我们在前面已经提过设计模式创建型模式的 3 种工厂模式 和 单例模式;本篇带来同属创建型模式的“建造者模式” 建造者模式(Builder Pattern)使...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作