首页 > 其他分享 >趣解建造者模式之网红小王购车记

趣解建造者模式之网红小王购车记

时间:2023-11-10 16:04:29浏览次数:28  
标签:return String 趣解 Car Builder 之网 红小王 car public

一、前言

本文章是关于设计模式中的建造者模式的,也称构建者模式/生成器模式,英文我们称之为Builder Pattern。在开展讲解之前,我们先把该模式的定义了解一下。

建造者模式的定义:

该模式可以实现产品的封装构造过程,并允许按步骤构造产品。

该模式的优点:

可以将一个复杂对象的创建过程封装起来,允许对象通过多个步骤来创建,并且可以改变过程;它也可以向客户隐藏产品内部的表现;因为客户只看到一个抽象接口,所以产品的具体实现是可以被替换的。

用途:

经常被用来创建组合结构。

缺点:

与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识。

二、讲个小故事

小王家境一般,但是呢,通过自己的努力成为了一个小网红,收入也逐渐多了起来。他从小就羡慕开汽车的人,所以,自己也决定买辆车。

趣解建造者模式之网红小王购车记_Java

他首先去了奥迪的4s店,车子很多,也很不错。4S店的销售人员给他介绍了很多车型,他看中了奥迪的A4L,各方面都挺喜欢的,然后就打算付款了。

正在这个时候,他的助理给他打电话,“小王!榜一大哥准备签约你了!签约费用给你1000万!你发达了!”,小王一听,高兴坏了,这不一下子鸡窝变凤凰了嘛!他挂断电话,觉得自己得买一辆更独特的汽车,而不是大街上较为常见的A4L了,然后他问销售人员,这个车我能自己定制不?销售人员说,我们只有一些选配项,定制不了。小王很失望,他太想拥有一辆“专属”自己的车子了。

趣解建造者模式之网红小王购车记_后端_02

这个时候,销售人员建议他,去看一看保时捷,定制的项目非常多。然后呢,他就去了保时捷4s店,从那边他发现,从小的轮毂logo,再到外观中控,都能选配和定制,这就太好了,他选了好多自己喜欢的定制型,这样,一辆完完全全“专属”小王的保时捷跑车就定制好了。

趣解建造者模式之网红小王购车记_ide_03

三、模式的使用方式

从上面的例子我们可以看到,对于普通汽车来说,大多采用固定的一些配置项,我们获得的汽车往往没有特殊化定制的需求,那么这种情况,我们通过工厂方法或者抽象工厂就可以满足需求。

但是对于高端客户,往往需要定制化的东西比较多,那么创建出来的实例对象也更为复杂和灵活,对于这种场景,我们就可以通过Builder模式来进行对象的创建了。

所以,当我们需要自定义各种对象的细节部分,然后最终拼装出一个个性化实例对象时,就非常适合采用建造者模式。

获得一个车架子,拼装车门,拼装轮胎,拼装发动机,拼装变速箱……,然后获得最终的个性化汽车。

3.1> 类图

在通过上面的例子了解了建造者模式之后,我们就通过类图的方式,展示一下该模式。在下图中,我们提供了两种场景:分别是客户不可定制客户可以定制,具体选择哪种实现方式,可以根据具体的业务场景来自行选择:

趣解建造者模式之网红小王购车记_java_04

3.2> 代码实现

创建一个汽车实体类Car,里面包含4个组件,分别是:汽车引擎(engine)、变速齿轮(gear)、车门(door)和汽车轮胎(wheel),代码如下所示:

@ToString
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Car {
    private String engine = "普通标准的发动机";
    private String gear = "普通标准的齿轮";
    private String door = "普通标准的车门";
    private String wheel = "普通标准的轮胎";
}

创建构造器接口Builder,提供安装引擎(initalEngine)、安装齿轮(initalGear)、安装车门(initalDoor)、安装轮胎(initailWheel)等功能:

public interface Builder {
    // 安装引擎
    Builder initalEngine(String engine);

    // 安装齿轮
    Builder initalGear(String gear);

    // 安装车门
    Builder initalDoor(String door);

    // 安装轮胎
    Builder initailWheel(String wheel);

    // 获得构建后的汽车
    Car getCar();
}

根据Builder接口,实现创建奥迪车的Builder实现类——AudiBuilder:

public class AudiBuilder implements Builder {
    private Car car;

    public AudiBuilder() {
        car = new Car("Audi普通的发动机",
                "Audi普通标准的齿轮",
                "Audi普通标准的车门",
                "Audi普通标准的轮胎");
    }

    @Override
    public Builder initalEngine(String engine) {
        car.setEngine(engine);
        return this;
    }

    @Override
    public Builder initalGear(String gear) {
        car.setGear(gear);
        return this;
    }

    @Override
    public Builder initalDoor(String door) {
        car.setDoor(door);
        return this;
    }

    @Override
    public Builder initailWheel(String wheel) {
        car.setWheel(wheel);
        return this;
    }

    @Override
    public Car getCar() {
        return car;
    }
}

根据Builder接口,实现创建宝马车的Builder实现类——BMWBuilder:

public class BMWBuilder implements Builder {
    private static Car car = new Car("BMW普通的发动机", 
                                     "BMW普通标准的齿轮", 
                                     "BMW普通标准的车门",
                                     "BMW普通标准的轮胎");

    @Override
    public Builder initalEngine(String engine) {
        car.setEngine(engine);
        return this;
    }

    @Override
    public Builder initalGear(String gear) {
        car.setGear(gear);
        return this;
    }

    @Override
    public Builder initalDoor(String door) {
        car.setDoor(door);
        return this;
    }

    @Override
    public Builder initailWheel(String wheel) {
        car.setWheel(wheel);
        return this;
    }

    @Override
    public Car getCar() {
        return car;
    }
}

创建工人类Worker,这个工人可以创建奥迪A4L型号汽车(createA4LCar)和奥迪R8跑车(createR8Car),也可以创建普通的宝马汽车(createCommonBMW):

public class Worker {
    Car createA4LCar() {
        return new AudiBuilder().
        initalEngine("Audi的4缸发动机").
        initalGear("6速双离合变速箱").getCar();
    }
    Car createR8Car() {
        return new AudiBuilder().
        initalEngine("16缸跑车引擎").
        initalDoor("碳纤维轻量级车门").
        initalGear("7档湿式双离合变速箱").
        initailWheel("米其林Top2竞速级轮胎").getCar();
    }
    Car createCommonBMW() {
        return new BMWBuilder().getCar();
    }
}

创建测试类BuilderTest,使得工人创建奥迪A4L、奥迪R8跑车和普通的宝马汽车:

public class BuilderTest {
    public static void main(String[] args) {
        Worker worker = new Worker();
        Car audiR8 = worker.createR8Car();
        Car audiA4L = worker.createA4LCar();
        Car commonBMW = worker.createCommonBMW();

        System.out.println("audiR8=" + audiR8);
        System.out.println("audiA4L=" + audiA4L);
        System.out.println("commonBMW=" + commonBMW);
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

标签:return,String,趣解,Car,Builder,之网,红小王,car,public
From: https://blog.51cto.com/muse/8303736

相关文章

  • 19.网络编程之网络基础概念
    19.网络编程之网络基础概念学习目标了解OSI七层、TCP/IP四层模型结构了解常见网络协议格式掌握网络字节序和主机字节序之间的转换(大端法和小端法)说出TCP服务器端通信流程说出TCP客户端通信流程独立写出TCP服务器端代码独立写出TCP客户端代码1.网络基础概......
  • 有趣的Java之网络多线程——UDP编程
    UDP编程通信基本介绍类DatagramSocket和DatagramPacket【数据包/数据报】实现了基于UDP协议网络程序。UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能安全送到目的地,也不确信什么时候可以抵达。DatagramPacket对象封装了UDP数据报,在数据报中包含了发......
  • 保护隐私与增强网络安全之网络代理技术
    前言网络代理技术是一种广泛应用于互联网上的机制,用于代表客户端访问远程服务。网络代理技术可以保护隐私、增强网络安全和提高网络性能。本文将深入探讨网络代理技术的原理、类型、应用、优劣势及未来发展趋势。一、网络代理技术原理网络代理技术是通过在网络上建立代理服务器,将客......
  • 趣解设计模式之《珍爱生命,远离只狼》
    〇、小故事小王最近打算入手一款叫《只狼》的游戏,这款游戏特别的硬核,也就是说,普通的小怪战斗力都特别的强,而作为主角的我们,也很容易被小兵打败。除了游戏中的小兵和Boss很难打败之外,如果在游戏中被杀了,也需要从这章的开头开始打,没办法直接从死亡点附近复活,这个就又为游戏增加了......
  • 趣解设计模式之《会飞的橡皮鸭》
    〇、小故事小王公司要开发一个养鸭子的模拟养育游戏。游戏中会出现各种类型的鸭子。小王设计了一个基础的鸭子类——Duck类,这个类有3个方法:【quack】用来描述鸭子叫声的方法;<br>【swim】用来描述鸭子游泳姿态的方法;<br>【display】用来描述鸭子外貌的方法;然后通过继承Duck类......
  • 趣解设计模式之《新娘到底叫啥名啊?》
    〇、小故事前一段时间,在网上流传了这么一段视频,视频是一对新人的婚礼现场,主持人让新郎当着众多亲戚朋友的面,大声对新娘表达自己的爱意,小伙子自信满满大声的对众人说:“我爱你,周秀楠!”。但是台下的新娘却一脸茫然,从表情中根本没有看出一丝丝因为新郎的表白而开心的喜悦。主持人......
  • 趣解设计模式之《小店儿菜单的故事》
    〇、小故事在一座小镇上,有两家特别有名气的小店,一家是远近闻名的早餐店,它家的早餐特别好吃,每天早上都能排起长长的队伍;另一家是个蛋糕店,他家是专门从法国请来的蛋糕师傅,蛋糕的香味真是香飘万里。自从听说这个酱香拿铁销量非常高之后,这两家店的老板们就觉得强强联合才是能让小店更......
  • 趣解设计模式之《办理入职这么难吗?》
    〇、小故事小王大学毕业,经过大学期间的刻苦学习,终于成功的面试上了一家公司。按照约定的时间,小王兴高采烈的来到公司前台去办理入职手续。“您好,我是来办理入职手续的”小王对前台妹妹说,前台妹妹看都没看他一眼,顺手递给了他一个单子,带着一丝不耐烦的语气跟他说,“照着单子做就行”......
  • 趣解接口隔离原则之《做个Rapper咋这么难?》
    〇、小故事不知道大家是否看过这样一个短视频——“姐姐去找她的弟弟,因为她的弟弟想要当rapper而荒废了学业,姐姐多番劝导也没有用,最后一怒一下,把弟弟的rapper发型剃了。没有了帅气的rapper发型,弟弟也放弃了当rapper的想法了。”这时候有的同学可能就会问,“扯淡!发型剃掉了就不当r......
  • 趣解里式替换之《我买了宝马,为啥不让我停这》
    〇、小故事我们**怎么识别一辆汽车是宝马品牌的汽车呢?**虽然宝马汽车车辆型号非常的多,而且外型也各不相同,但是只要是宝马品牌的汽车,它的车头一定会有宝马汽车的logo,那么这个就是大家最直观去确认一辆车是不是宝马牌汽车的主要依据了。所以,宝马公司就跟各地负责宝马专属停车位的......