概念
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
参考连接: 建造者模式 | 菜鸟教程
代码案例
设计两个接口,一个条目接口,一个打包接口
/**
* 车子条目接口类
*/
public interface Item {
/**
* 名称
* @return
*/
public String name();
/**
* 包装
* @return
*/
public Packing packing();
/**
* 价格
* @return
*/
public double price();
}
/**
* 包装接口类
*/
public interface Packing {
/**
* 打包
* @return
*/
public String pack();
}
完成两类车子实现类
自行车抽象实现类
/**
* 自行车抽象类
*/
public abstract class Bicycle implements Item {
/**
* 包装得打纸箱
* @return
*/
@Override
public Packing packing(){
return new Carton();
}
/**
* 自行车价格
* @return
*/
@Override
public abstract double price();
}
自行车细类-捷安特
/**
* 捷安特自行车
*/
@Slf4j
public class Giant extends Bicycle{
/**
* 自行车名称
* @return
*/
@Override
public String name() {
log.info("捷安特自行车");
return "捷安特";
}
/**
* 自行车价格
* @return
*/
@Override
public double price() {
float price=2500f;
return price;
}
}
自行车细类-美利达
/**
* 美利达自行车
*/
@Slf4j
public class Merida extends Bicycle{
/**
* 自行车名称
* @return
*/
@Override
public String name() {
log.info("美利达自行车");
return "美利达";
}
/**
* 自行车价格
* @return
*/
@Override
public double price() {
float price=2700f;
return price;
}
}
自行车打包实现类-打纸箱
/**
* 打纸箱实现类
*/
@Slf4j
public class Carton implements Packing {
@Override
public String pack() {
log.info("打纸箱");
return "Carton";
}
}
汽车抽象实现类
/**
* 汽车抽象类
*/
public abstract class Car implements Item {
/**
* 包装得打木箱
* @return
*/
@Override
public Packing packing(){
return new Wooden();
}
/**
* 汽车价格
* @return
*/
@Override
public abstract double price();
}
汽车实现细类-奔驰
/**
* 奔驰汽车
*/
@Slf4j
public class Benz extends Car {
@Override
public String name() {
log.info("奔驰汽车");
return "奔驰";
}
@Override
public double price() {
float price=420000f;
return price;
}
}
汽车实现细类-宝马
/**
* 宝马汽车
*/
@Slf4j
public class BMW extends Car {
@Override
public String name() {
log.info("宝马汽车");
return "宝马";
}
@Override
public double price() {
float price=560000f;
return price;
}
}
汽车打包实现类-打木箱
/**
* 打木箱实现类
*/
@Slf4j
public class Wooden implements Packing {
@Override
public String pack() {
log.info("打木箱");
return "Wooden";
}
}
购买商品组合
/**
* 购买商品组合套餐
*/
@Slf4j
public class Buy {
List<Item> items= new ArrayList<Item>();
/**
* 新增条目
* @param item
*/
public void addItem(Item item){
items.add(item);
}
/**
* 总花费
* @return
*/
public float getCost(){
float cost=0.0f;
for (Item item : items) {
cost+=item.price();
}
return cost;
}
public List<ItemEntity> showItems(){
List<ItemEntity> entities= new ArrayList<>();
for (Item item : items) {
String name = item.name();
String pack = item.packing().pack();
double price = item.price();
entities.add(new ItemEntity(name, pack, price));
log.info("Item: "+ name +",Packing: "+ pack +",Price: "+ price);
}
return entities;
}
}
购买商品建造类
/**
* 购买商品构造器
*/
@Slf4j
public class BuyBuilder {
/**
* 宝马捷安特
* @return
*/
public Buy bmwGiant(){
Buy buy= new Buy();
buy.addItem(new BMW());
buy.addItem(new Giant());
return buy;
}
/**
* 奔驰美利达
* @return
*/
public Buy benzMerida(){
Buy buy= new Buy();
buy.addItem(new Benz());
buy.addItem(new Merida());
return buy;
}
}
公共类
@Setter
@Getter
@AllArgsConstructor
public class ItemEntity {
/**
* 名称
* @return
*/
public String name;
/**
* 包装
* @return
*/
public String packing;
/**
* 价格
* @return
*/
public double price;
}
/**
* 响应结果类
*/
@Data
@ToString
public class ResponseModel implements Serializable {
//消息
private String message;
//状态码
private int messageCode;
//结果
private Object result;
public ResponseModel(String message, int messageCode, Object result) {
this.message = message;
this.messageCode = messageCode;
this.result = result;
}
public ResponseModel() {
}
}
测试类
/**
* 设计模式控制器
*/
@RestController
@RequestMapping("/designPattern")
@Slf4j
public class DesignController {
@GetMapping("/builder")
public ResponseModel builder() {
BuyBuilder bmwGiant= new BuyBuilder();
log.info("================= 宝马捷安特 =================");
Buy buyBmwGiant = bmwGiant.bmwGiant();
List<ItemEntity> buyBmwGiantEntities = buyBmwGiant.showItems();
log.info("总花费: "+buyBmwGiant.getCost());
log.info("================= 奔驰美利达 =================");
Buy buyBenzMerida = bmwGiant.benzMerida();
List<ItemEntity> buyBenzMeridaEntities = buyBenzMerida.showItems();
log.info("总花费: "+buyBenzMerida.getCost());
Map map =new HashMap();
map.put("宝马捷安特",buyBmwGiantEntities);
map.put("奔驰美利达",buyBenzMeridaEntities);
return new ResponseModel("建造者模式完成", 200, map);
}
}
测试案例
2022-06-17 00:36:12.110 INFO ================= 宝马捷安特 ================= 【http-nio-8081-exec-3】【DesignController:45】
2022-06-17 00:36:12.111 INFO 宝马汽车 【http-nio-8081-exec-3】【BMW:13】
2022-06-17 00:36:12.111 INFO 打木箱 【http-nio-8081-exec-3】【Wooden:13】
2022-06-17 00:36:12.111 INFO Item: 宝马,Packing: Wooden,Price: 560000.0 【http-nio-8081-exec-3】【Buy:44】
2022-06-17 00:36:12.112 INFO 捷安特自行车 【http-nio-8081-exec-3】【Giant:16】
2022-06-17 00:36:12.112 INFO 打纸箱 【http-nio-8081-exec-3】【Carton:13】
2022-06-17 00:36:12.112 INFO Item: 捷安特,Packing: Carton,Price: 2500.0 【http-nio-8081-exec-3】【Buy:44】
2022-06-17 00:36:12.113 INFO 总花费: 562500.0 【http-nio-8081-exec-3】【DesignController:48】
2022-06-17 00:36:12.113 INFO ================= 奔驰美利达 ================= 【http-nio-8081-exec-3】【DesignController:49】
2022-06-17 00:36:12.113 INFO 奔驰汽车 【http-nio-8081-exec-3】【Benz:13】
2022-06-17 00:36:12.113 INFO 打木箱 【http-nio-8081-exec-3】【Wooden:13】
2022-06-17 00:36:12.114 INFO Item: 奔驰,Packing: Wooden,Price: 420000.0 【http-nio-8081-exec-3】【Buy:44】
2022-06-17 00:36:12.114 INFO 美利达自行车 【http-nio-8081-exec-3】【Merida:16】
2022-06-17 00:36:12.114 INFO 打纸箱 【http-nio-8081-exec-3】【Carton:13】
2022-06-17 00:36:12.114 INFO Item: 美利达,Packing: Carton,Price: 2700.0 【http-nio-8081-exec-3】【Buy:44】
2022-06-17 00:36:12.115 INFO 总花费: 422700.0 【http-nio-8081-exec-3】【DesignController:52】