java设计模式:建造者模式之生产线
作者:二当家的白帽子 时间:2023-11-04 10:47:24
什么是建造者模式
建造者模式( 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
标签:java,设计模式,建造者模式
0
投稿
猜你喜欢
C#自适应合并文件的方法
2023-09-28 05:27:13
Java异常处理机制try catch流程详解
2022-09-23 08:51:09
SpringBoot集成支付宝沙箱支付(支付、退款)
2022-02-15 16:50:52
C#实现根据图片的链接地址获取图片的后缀名
2022-08-04 04:30:58
Vs2022环境下安装低版本.net framework的实现步骤
2023-07-04 02:58:12
C#串口连接的读取和发送详解
2022-05-11 10:04:47
springboot2.0如何通过fastdfs实现文件分布式上传
2022-03-20 16:49:24
C#取得Web程序和非Web程序的根目录的N种取法总结
2023-07-16 07:37:32
java开发ShardingSphere的路由引擎类型示例详解
2023-11-29 01:18:56
Android布局技巧之使用ViewStub
2023-03-22 06:34:10
Unity实现聊天室功能
2023-12-20 19:53:34
Android实现的仿淘宝购物车demo示例
2023-09-04 08:59:19
SpringBoot集成EasyExcel的步骤
2023-07-19 09:59:17
c#代码自动修改解决方案下任意文件实例
2023-01-31 07:27:10
关于maven全局配置文件settings.xml解析
2023-01-08 09:04:04
Java中实现获取路径的方法汇总
2022-12-19 08:10:54
java 动态生成bean的案例
2023-08-09 02:20:05
SpringBoot集成Caffeine缓存的实现步骤
2023-08-23 05:44:11
Android集成zxing扫码框架功能
2021-09-27 02:37:17
Java之线程编程的4种方法实现案例讲解
2021-11-18 18:40:46