当前位置: 首页 > news >正文

设计模式——建造者模式(Java示例)

引言

生成器是一种创建型设计模式, 使你能够分步骤创建复杂对象。

与其他创建型模式不同, 生成器不要求产品拥有通用接口。 这使得用相同的创建过程生成不同的产品成为可能。

复杂度: 中等

流行度: 流行

使用示例: 生成器模式是 Java 世界中的一个著名模式。 当你需要创建一个可能有许多配置选项的对象时, 该模式会特别有用。

生成器在 Java 核心程序库中得到了广泛的应用:

  • java.lang.StringBuilder#append() ( 非同步 )
  • java.lang.StringBuffer#append() ( 同步 )
  • java.nio.ByteBuffer#put() (还有 Char­Buffer、 Short­Buffer、 Int­Buffer、 Long­Buffer、 Float­Buffer 和 Double­Buffer)
  • javax.swing.GroupLayout.Group#addComponent()
  • java.lang.Appendable的所有实现

 识别方法: 生成器模式可以通过类来识别, 它拥有一个构建方法和多个配置结果对象的方法。 生成器方法通常支持方法链 (例如 someBuilder.​setValueA(1).​setValueB(2).​create())。

分步制造汽车

在本例中, 生成器模式允许你分步骤地制造不同型号的汽车。

示例还展示了生成器如何使用相同的生产过程制造不同类型的产品 (汽车手册)。

主管控制着构造顺序。 它知道制造各种汽车型号需要调用的生产步骤。 它仅与汽车的通用接口进行交互。 这样就能将不同类型的生成器传递给主管了。

最终结果将从生成器对象中获得, 因为主管不知道最终产品的类型。 只有生成器对象知道自己生成的产品是什么。

 builders

 builders/Builder.java: 通用生成器接口
package refactoring_guru.builder.example.builders;import refactoring_guru.builder.example.cars.CarType;
import refactoring_guru.builder.example.components.Engine;
import refactoring_guru.builder.example.components.GPSNavigator;
import refactoring_guru.builder.example.components.Transmission;
import refactoring_guru.builder.example.components.TripComputer;/*** Builder interface defines all possible ways to configure a product.*/
public interface Builder {void setCarType(CarType type);void setSeats(int seats);void setEngine(Engine engine);void setTransmission(Transmission transmission);void setTripComputer(TripComputer tripComputer);void setGPSNavigator(GPSNavigator gpsNavigator);
}
builders/CarBuilder.java: 汽车生成器
/*** Concrete builders implement steps defined in the common interface.*/
public class CarBuilder implements Builder {private CarType type;private int seats;private Engine engine;private Transmission transmission;private TripComputer tripComputer;private GPSNavigator gpsNavigator;public void setCarType(CarType type) {this.type = type;}@Overridepublic void setSeats(int seats) {this.seats = seats;}@Overridepublic void setEngine(Engine engine) {this.engine = engine;}@Overridepublic void setTransmission(Transmission transmission) {this.transmission = transmission;}@Overridepublic void setTripComputer(TripComputer tripComputer) {this.tripComputer = tripComputer;}@Overridepublic void setGPSNavigator(GPSNavigator gpsNavigator) {this.gpsNavigator = gpsNavigator;}public Car getResult() {return new Car(type, seats, engine, transmission, tripComputer, gpsNavigator);}
}

 builders/CarManualBuilder.java: 汽车手册生成器


/*** Unlike other creational patterns, Builder can construct unrelated products,* which don't have the common interface.** In this case we build a user manual for a car, using the same steps as we* built a car. This allows to produce manuals for specific car models,* configured with different features.*/
public class CarManualBuilder implements Builder{private CarType type;private int seats;private Engine engine;private Transmission transmission;private TripComputer tripComputer;private GPSNavigator gpsNavigator;@Overridepublic void setCarType(CarType type) {this.type = type;}@Overridepublic void setSeats(int seats) {this.seats = seats;}@Overridepublic void setEngine(Engine engine) {this.engine = engine;}@Overridepublic void setTransmission(Transmission transmission) {this.transmission = transmission;}@Overridepublic void setTripComputer(TripComputer tripComputer) {this.tripComputer = tripComputer;}@Overridepublic void setGPSNavigator(GPSNavigator gpsNavigator) {this.gpsNavigator = gpsNavigator;}public Manual getResult() {return new Manual(type, seats, engine, transmission, tripComputer, gpsNavigator);}
}

cars

 cars/Car.java: 汽车产品
/*** Car is a product class.*/
public class Car {private final CarType carType;private final int seats;private final Engine engine;private final Transmission transmission;private final TripComputer tripComputer;private final GPSNavigator gpsNavigator;private double fuel = 0;public Car(CarType carType, int seats, Engine engine, Transmission transmission,TripComputer tripComputer, GPSNavigator gpsNavigator) {this.carType = carType;this.seats = seats;this.engine = engine;this.transmission = transmission;this.tripComputer = tripComputer;if (this.tripComputer != null) {this.tripComputer.setCar(this);}this.gpsNavigator = gpsNavigator;}public CarType getCarType() {return carType;}public double getFuel() {return fuel;}public void setFuel(double fuel) {this.fuel = fuel;}public int getSeats() {return seats;}public Engine getEngine() {return engine;}public Transmission getTransmission() {return transmission;}public TripComputer getTripComputer() {return tripComputer;}public GPSNavigator getGpsNavigator() {return gpsNavigator;}
}
 cars/Manual.java: 手册产品
/*** Car manual is another product. Note that it does not have the same ancestor* as a Car. They are not related.*/
public class Manual {private final CarType carType;private final int seats;private final Engine engine;private final Transmission transmission;private final TripComputer tripComputer;private final GPSNavigator gpsNavigator;public Manual(CarType carType, int seats, Engine engine, Transmission transmission,TripComputer tripComputer, GPSNavigator gpsNavigator) {this.carType = carType;this.seats = seats;this.engine = engine;this.transmission = transmission;this.tripComputer = tripComputer;this.gpsNavigator = gpsNavigator;}public String print() {String info = "";info += "Type of car: " + carType + "\n";info += "Count of seats: " + seats + "\n";info += "Engine: volume - " + engine.getVolume() + "; mileage - " + engine.getMileage() + "\n";info += "Transmission: " + transmission + "\n";if (this.tripComputer != null) {info += "Trip Computer: Functional" + "\n";} else {info += "Trip Computer: N/A" + "\n";}if (this.gpsNavigator != null) {info += "GPS Navigator: Functional" + "\n";} else {info += "GPS Navigator: N/A" + "\n";}return info;}
}

 cars/CarType.java

package refactoring_guru.builder.example.cars;public enum CarType {CITY_CAR, SPORTS_CAR, SUV
}

components

 components/Engine.java: 产品特征 1
/*** Just another feature of a car.*/
public class Engine {private final double volume;private double mileage;private boolean started;public Engine(double volume, double mileage) {this.volume = volume;this.mileage = mileage;}public void on() {started = true;}public void off() {started = false;}public boolean isStarted() {return started;}public void go(double mileage) {if (started) {this.mileage += mileage;} else {System.err.println("Cannot go(), you must start engine first!");}}public double getVolume() {return volume;}public double getMileage() {return mileage;}
}
components/GPSNavigator.java: 产品特征 2
/*** Just another feature of a car.*/
public class GPSNavigator {private String route;public GPSNavigator() {this.route = "221b, Baker Street, London  to Scotland Yard, 8-10 Broadway, London";}public GPSNavigator(String manualRoute) {this.route = manualRoute;}public String getRoute() {return route;}
}
components/Transmission.java: 产品特征 3
/*** Just another feature of a car.*/
public enum Transmission {SINGLE_SPEED, MANUAL, AUTOMATIC, SEMI_AUTOMATIC
}
 components/TripComputer.java: 产品特征 4
/*** Just another feature of a car.*/
public class TripComputer {private Car car;public void setCar(Car car) {this.car = car;}public void showFuelLevel() {System.out.println("Fuel level: " + car.getFuel());}public void showStatus() {if (this.car.getEngine().isStarted()) {System.out.println("Car is started");} else {System.out.println("Car isn't started");}}
}

director

 director/Director.java: 主管控制生成器
/*** Director defines the order of building steps. It works with a builder object* through common Builder interface. Therefore it may not know what product is* being built.*/
public class Director {public void constructSportsCar(Builder builder) {builder.setCarType(CarType.SPORTS_CAR);builder.setSeats(2);builder.setEngine(new Engine(3.0, 0));builder.setTransmission(Transmission.SEMI_AUTOMATIC);builder.setTripComputer(new TripComputer());builder.setGPSNavigator(new GPSNavigator());}public void constructCityCar(Builder builder) {builder.setCarType(CarType.CITY_CAR);builder.setSeats(2);builder.setEngine(new Engine(1.2, 0));builder.setTransmission(Transmission.AUTOMATIC);builder.setTripComputer(new TripComputer());builder.setGPSNavigator(new GPSNavigator());}public void constructSUV(Builder builder) {builder.setCarType(CarType.SUV);builder.setSeats(4);builder.setEngine(new Engine(2.5, 0));builder.setTransmission(Transmission.MANUAL);builder.setGPSNavigator(new GPSNavigator());}
}
Demo.java: 客户端代码
/*** Demo class. Everything comes together here.*/
public class Demo {public static void main(String[] args) {Director director = new Director();// Director gets the concrete builder object from the client// (application code). That's because application knows better which// builder to use to get a specific product.CarBuilder builder = new CarBuilder();director.constructSportsCar(builder);// The final product is often retrieved from a builder object, since// Director is not aware and not dependent on concrete builders and// products.Car car = builder.getResult();System.out.println("Car built:\n" + car.getCarType());CarManualBuilder manualBuilder = new CarManualBuilder();// Director may know several building recipes.director.constructSportsCar(manualBuilder);Manual carManual = manualBuilder.getResult();System.out.println("\nCar manual built:\n" + carManual.print());}}
 OutputDemo.txt: 执行结果
Car built:
SPORTS_CARCar manual built:
Type of car: SPORTS_CAR
Count of seats: 2
Engine: volume - 3.0; mileage - 0.0
Transmission: SEMI_AUTOMATIC
Trip Computer: Functional
GPS Navigator: Functional

http://www.lryc.cn/news/258007.html

相关文章:

  • 深入探索 Spring Boot:简化开发,加速部署的全方位利器
  • SpectralGPT: Spectral Foundation Model 论文翻译3
  • ubuntu-c++-可执行模块-动态链接库-链接库搜索-基础知识
  • HTML中使用JavaScript实现一个简单的鼠标悬停特效。
  • 深入.NET平台和C#编程总结大全
  • jOOQ的使用场景
  • Pytorch-Transformer轴承故障一维信号分类(三)
  • pycharm多线程报错的问题(未解决)
  • 【常用字符大全】含emoji表情
  • android 蓝牙开关设置
  • C++ extern “C“ 用法
  • HTML面试题---专题四
  • stm32项目(11)——基于stm32的俄罗斯方块游戏机
  • 【计算机网络基础2】IP地址和子网掩码
  • ES6-import后是否有{}的区别
  • rv1126-rv1109-以太网功能-eth-(原理篇)
  • 【IDEA】反向撤销操作快捷键 ctrl+shift+z 和搜狗热键冲突的解决办法
  • 数据结构之----逻辑结构、物理结构
  • pip 通过git安装库
  • C语言——从终端输入 3 个数 a、b、c,按从大到小的顺序输出。
  • 【JVM从入门到实战】(二)字节码文件的组成
  • OPC UA常见故障信息代码
  • 第20关 快速掌握K8S下的有状态服务StatefulSet
  • ​如何使用https://www.krea.ai/来实现文生图,图生图,
  • 点滴生活记录2
  • 【带头学C++】----- 九、类和对象 ---- 9.12 C++之友元函数(9.12.1---12.4)
  • 设计模式的定义
  • 【Kubernetes】存储类StorageClass
  • 【LLM】大模型之RLHF和替代方法(DPO、RAILF、ReST等)
  • Spring Boot监听redis过期的key