JAVA23种设计模式——建造者模式

news/2024/11/16 13:54:40/

本文主要讲一下建造者模式,因为其和工厂模式都是封装细节,只提供最终的成品,所以讲完建造者模式,再讲一下两种模式之间的异同,以及在什么环境下使用什么样的模式。
如果对工厂模式还不了解可以先看这篇文章:JAVA23种设计模式——工厂模式

一、建造者模式
建造者模式分三块内容(还是拿产品举例):

  • 产品本身(实体类)
  • 构建产品的标准(接口)和使用标准生产产品的车间(接口的实现类,具体生产什么产品每个车间都不同)
  • 导演类(指导各个车间进行工作并最终生产出成品)

用实际例子讲更清楚一些,举个造车的例子吧,虽然造车的例子被用的数不胜数…谁让它好理解呢。
车,由车身、车身颜色、四个轮子、发动机组成,然后我们写了个实体类:

public class Car {private String body;//车身private String color;//车身颜色private String wheel;//轮子private String engine;//引擎public String getBody() {return body;}public void setBody(String body) {this.body = body;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public String getWheel() {return wheel;}public void setWheel(String wheel) {this.wheel = wheel;}public String getEngine() {return engine;}public void setEngine(String engine) {this.engine = engine;}
}

想要建造的产品有了,接着我们要定一个行业标准,以后大家造车都用这个标准,所以我们写了个接口:

public interface CarStandard{public void buildBody();public void buildColor();public void buildWheel();public void buildEngine();public Car getCar();
}

行业造车标准出来了,我们按这个标准开设一条红色BMW跑车的流水线吧:

public class RedBMW implements CarStandard {Car car = new Car();@Overridepublic void buildBody() {car.setBody("车身构建成型,流畅的车身弧线");}@Overridepublic void buildColor() {car.setColor("炫丽的红色车漆喷漆完成");}@Overridepublic void buildWheel() {car.setWheel("跑车专用轮胎装配完成");}@Overridepublic void buildEngine() {car.setEngine("跑车的灵魂,引擎装备成功");}@Overridepublic Car getCar() {return car;}
}

流水线也有了,让我们的车间主任(也就是大家说的director导演类)指导大家干活吧:

//具体怎么干,先装轮子还是先喷漆,都听车间主任的(指挥的艺术,所以叫director导演类)
public class Director {public Car creatCar(CarStandard entityCar){//指导大家干活流程的具体方法,括号里的参数是建造者模式的亮点,传入实现了造车标准的不同的流水线,主任可以指挥造不同的车entityCar.buildBody();entityCar.buildColor();entityCar.buildWheel();entityCar.buildEngine();System.out.println("车辆装配完成,可以驾驶");return entityCar.getCar();}public void showDetails(Car car){//造车流程细节展示(这个方法可有可无,为了丰富剧情和人物形象加了个细节展示)System.out.println(car.getBody());System.out.println(car.getColor());System.out.println(car.getWheel());System.out.println(car.getEngine());}
}

这时候厂长来了,找到车间主任说既然装好了一条流水线,你先造一辆来我开一下:

public class Test {public static void main(String[] args){Director director = new Director();//把车间主任叫来CarStandard redBMW = new RedBMW();//说要生产一台红色BMW跑车Car car = director.creatCar(redBMW);//车间主任接到任务就去让流水线造车了car.showDetails();//车间主任为了表明自己能干,还向厂长亲自展示了造车流程的细节}
}

细节展示:

车身构建成型,流畅的车身弧线
炫丽的红色车漆喷漆完成
跑车专用轮胎装配完成
跑车的灵魂,引擎装备成功
车辆装配完成,可以驾驶

厂长开完说好好好,明天拨款再开一条流水线。。。

到此建造者模式就讲完了,再总结一下,文章讲究首尾呼应:

建造者模式就是把具体的建造流程制定一个标准(写一个接口),所有的实现类都实现这个接口,导演类负责具体流程,只要是实现了行业标准(实现了这个接口的类),都可以传进来按导演类的流程走,最终导演类返回成品。
用户(厂长)只需要和导演类对接就可以了,提出要求(来个红色跑车),导演类接到任务就去生产产品,但是生产产品的细节用户是无需关心的,最终取到的是成品就OK了。

建造者模式优点:当多个对象的流程大致都相同时,可以使用建造者模式,细节易于控制,又使成品本身和细节解耦,抽象出细节建立一个标准,每增加一种产品就可以直接实现接口,易于扩展。
建造者模式缺点:优点的第一条反过来就是缺点,当想要建造的对个对象流程差异化很大时,就不再适合使用构造者模式,当创建相似的对象不多时,就不至于再专门按照建造者模式架构,也限制了它的扩展。

二、建造者模式和工厂模式
相对来说,工厂模式对细节操控的粒度比较粗,工厂模式更加关注于如何创建对象、获取对象,建造者模式更加偏重于对象的细节,可以更好的对参数进行更改和优化把控。但是两种模式并不能因此就分出优劣,它们各有其适应的应用场景。比如当使用者更偏重于对象的获取,想把创建对象的过程隐藏,就可以用工厂方法模式,当有多个相似对象需要获取,就可以使用抽象工厂模式。 但是当使用者更想对细节进行构造,比如在获取最终的对象之前,我对它具体的实现有不同的细节构造,张三要红色带尾翼两座的跑车,李四要黑色加长五座的商务车,这时候就可以用建造者模式来更精确的把控细节,但是建造者模式的好处就是,即使对细节精细刻画,也不会增加耦合度,实现了具体实现类和对象的解耦。
另外我想了一下,建造者模式的导演类实际上和模板方法模式的作用是一样的,都是把控流程,比如可以先装轮子,也可以先喷车漆,修改流程只需要在导演类调整一下顺序就可以了,具体的模板方法模式可以参考另一篇文章:JAVA23种设计模式——模板方法模式


http://www.ppmy.cn/news/698694.html

相关文章

TED | 25岁前,请逼自己成为这样的人

When I was in my 20s, I saw my very first psychotherapy client. I was a Ph.D. student in clinical psychology at Berkeley. She was a 26-year-old woman named Alex. 记得见我第一位心理咨询顾客时,我才20多岁。当时我是Berkeley临床心理学在读博士生。我的…

CS231n:面向视觉识别的卷积神经网络学习笔记(一)

图像分类 图像分类、数据驱动方法和流程 图像分类 目标:介绍图像分类问题 所谓图像分类问题,就是已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像。计算…

KNN(上)

来自斯坦福CS231n课程笔记image classification notes 内容列表如下: 图像分类、数据驱动方法和流程 Nearest Neighbor分类器 k-Nearest Neighbor 验证集、交叉验证集和超参数调参 Nearest Neighbor的优劣 小结 小结:应用kNN实践 拓展阅读 List…

图像分类与KNN

1 图像分类问题 1.1 什么是图像分类 所谓图像分类问题,就是已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像。虽然看起来挺简单的,但这可是计算机视觉领…

CS231n学习笔记-图像分类笔记(上篇)

原文地址:智能单元 图像分类:所谓图像分类问题,就是已有固定的分类标签集合,然后对于输入的图像按照标签类别,将其打上标签。 下面先介绍一下一个简单的图像如何利用计算机进行分类: 例子:以下图…

CS231n面向视觉识别的卷积神经网络翻译:图像分类笔记(上)

译者注:本文智能单元首发,译自斯坦福CS231n课程笔记image classification notes,由课程教师Andrej Karpathy授权进行翻译。本篇教程由杜客翻译完成。ShiqingFan对译文进行了仔细校对,提出了大量修改建议,态度严谨&…

致在研发路上努力奔跑的技术人

2019年2月4日,3M公司完成了对医疗信息技术开发商M*Modal约10亿美元的收购。此次收购旨在得到M*Modal的人工智能开发团队,从而推动其自身的医疗健康信息系统业务。2021年4月16日,微软宣布以197亿美元现金收购Nuance。这是智能语音行业最大的一…

斯坦福大学李飞飞团队图像分类课程笔记

斯坦福大学李飞飞团队图像分类课程笔记 Stanford image classification course notes这是斯坦福CS231n课程图像分类基础知识。 目标:这一节先介绍图像分类基本特征。 图像分类,简单的来说其实就是一个输入图像,输出对该图像内容分类的描述结…