java设计模式:建造者模式之生产线
作者:二当家的白帽子 发布时间:2023-11-04 10:47:24
标签:java,设计模式,建造者模式
什么是建造者模式
建造者模式( Builder Pattern )是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
实用范围:
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。当构造过程必须允许被构造的对象有不同表示时。
设计模式和编程语言无关,但是二当家的依然用Java语言去实战举例。
建造者模式中的角色
Builder:为创建一个产品对象的各个部件指定抽象接口。ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。Director:构造一个使用Builder接口的对象。Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
产品角色(Product)
我们用汽车作为产品角色(Product)。我们这里的车包含车身,引擎和动力源(真实的车当然不仅包含这些零件),车身必须有,没有车身根本不能称之为车。
package com.secondgod.builder;
import java.text.MessageFormat;
/**
* 汽车
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public class Car {
/**
* 车身(必须有)
*/
private final String body;
/**
* 引擎
*/
private String engine;
/**
* 动力源
*/
private String energy;
public Car(String body) {
this.body = body;
}
public String getBody() {
return body;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getEnergy() {
return energy;
}
public void setEnergy(String energy) {
this.energy = energy;
}
public String toString() {
return MessageFormat.format("在[{0}]车身上配备有[{1}]引擎和[{2}]动力源的汽车", body, engine, energy);
}
}
抽象建造者(Builder)
我们用汽车生产线接口作为抽象建造者角色(Builder)。声明出汽车生产线应该有的方法。这里我们仅仅包含建造车身,建造引擎,建造动力源的方法,对应车的配件,还有一个取车的方法用来将造好的车从生产线上取下来。
package com.secondgod.builder;
/**
* 汽车生产线
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public interface ICarBuilder {
/**
* 建造车身
*/
void buildBody();
/**
* 建造引擎
*/
void buildEngine();
/**
* 建造动力源
*/
void buildEnergy();
/**
* 取车
* @return
*/
Car retrieveCar();
}
具体建造者角色(ConcreteBuilder)
我们用燃油车生产线和电动车生产线作为具体建造者角色(ConcreteBuilder)。这里有一个细节,由于车身是必须有的,所以必须先建造车身。
package com.secondgod.builder;
/**
* 燃油车生产线
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public class GasolineCarBuilder implements ICarBuilder {
private Car car;
@Override
public void buildBody() {
car = new Car("燃油");
}
@Override
public void buildEngine() {
car.setEngine("燃油发动机");
}
@Override
public void buildEnergy() {
car.setEnergy("汽油油箱");
}
@Override
public Car retrieveCar() {
Car retrieveCar = car;
car = null;
return retrieveCar;
}
}
package com.secondgod.builder;
/**
* 电动车生产线
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public class ElectricCarBuilder implements ICarBuilder{
private Car car;
@Override
public void buildBody() {
car = new Car("电动");
}
@Override
public void buildEngine() {
car.setEngine("电驱动系统");
}
@Override
public void buildEnergy() {
car.setEnergy("新能源电池");
}
@Override
public Car retrieveCar() {
Car retrieveCar = car;
car = null;
return retrieveCar;
}
}
导演者角色(Director)
我们用汽车工程师作为导演者角色(Director)。他知道怎么操作生产线(对不起,我们的生产线不是全自动的)。
package com.secondgod.builder;
/**
* 汽车工程师
*
* @author 二当家的白帽子 https://le-yi.blog.csdn.net/
*/
public class CarEngineer {
/**
* 构建汽车
*
* @param builder
* @return
*/
public Car constructCar(ICarBuilder builder) {
builder.buildBody();
builder.buildEngine();
builder.buildEnergy();
return builder.retrieveCar();
}
}
最终测试
package com.secondgod.builder;
public class Test {
public static void main(String[] args) {
// 一个工程师
CarEngineer carEngineer = new CarEngineer();
// 两条生产线
ICarBuilder gasolineCarBuilder = new GasolineCarBuilder();
ICarBuilder electricCarBuilder = new ElectricCarBuilder();
// 一天造两辆
Car gasolineCar = carEngineer.constructCar(gasolineCarBuilder);
Car electricCar = carEngineer.constructCar(electricCarBuilder);
// 够生活了
System.out.println(gasolineCar);
System.out.println(electricCar);
}
}
来源:https://blog.csdn.net/leyi520/article/details/119383045


猜你喜欢
- 本文实例讲述了C#控件闪烁的解决方法。分享给大家供大家参考。具体分析如下:如果你在Form中绘图的话,不论是不是采用的双缓存,都会看到图片在
- android 修改launcher行数和列数Launcher3桌面的行数和列数都是在InvariantDeviceProfile.java
- Guava EventBusEventBus是Guava的事件处理机制,是设计模式中观察者模式(生产/消费者编程模型)的优雅实现。对于事件监
- Android短信验证码功能,供大家参考,具体内容如下1、参考资料Mob网站:http://www.mob.com/Mob在Github上的
- 在实践中,项目的某些配置信息是需要进行加密处理的,以减少敏感信息泄露的风险。比如,在使用Druid时,就可以基于它提供的公私钥加密方式对数据
- 一般使用@RequestBody接收的时候报400都是传入的json字符串和对应封装的对象不对应造成的首先要注意封装的对象中的字段类型有没有
- 1: Nacos搭建可以参考 https://www.jb51.net/article/196842.htmSpringCloud 版本&l
- 此文通过一段代码来展示java获取相关参数的方法分享给大家:public static void main(String[] args) {
- 本文实现android系统照相机的调用来拍照项目的布局相当简单,只有一个Button:<RelativeLayout xmlns:an
- 一、Images1、概述Image 类为Bitmap(位图) 和 Metafile(矢量图) 的类提供功能的抽象基类。Image类不能直接创
- 今天看一个教程,看到一个颜色渐变的ProgressBar,觉得有点意思,所以记录一番。下面这个是效果图颜色渐变的ProgressBar看到效
- 本文通过实例详细阐述了C++关于智能指针的概念及用法,有助于读者加深对智能指针的理解。详情如下:一、简介由于 C++ 语言没有自动内存回收机
- 问题:什么是自旋锁?说一下 synchronized 底层实现原理?多线程中 synchronized 锁升级的原理是什么?1. 轻量级锁的
- 在使用java项目时,如果没有详细的管理和辅助流程,就会像程序失去了系统的调配一样。在java中有一种专门管理项目的工具,叫做maven,除
- 图1如图1,我们工作过程中,无论平台网站还是企业官网,总少不了新闻展示。如某天产品经理跟我们说,推广人员想要抓取百度新闻中热点要闻版块提高站
- 前言:反射(Reflection)是.NET提供给开发者的一个强大工具,尽管作为.NET框架的使用者,很多时候不会用到反射。但在一些情况下,
- 前言由于android M的popupwindow与之前版本不一致,笔者找不到能够代码监听物理返回键的方式,故另寻方式实现筛选菜单。5.0及
- 为了方便客户抓取Log,现通过TCP协议连接指定服务器,传输指定内容,定义指定目录,IP,PORT字段接收参数。直接上代码 public s
- Java Function的使用一、方法介绍表示接受一个参数并产生结果的函数。参数类型 T - 函数输入的类型R - 函数的结果类型方法介绍
- //执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。其中静态代码块只执行一次。构造代码块在每