概念
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
参考连接: https://www.runoob.com/design-pattern/builder-pattern.html
代码案例
设计两个接口,一个条目接口,一个打包接口
/** * 车子条目接口类 */ 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】