• 徒手撸设计模式建造者模式


    概念

    建造者模式(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:452022-06-17 00:36:12.111 INFO  宝马汽车 【http-nio-8081-exec-3】【BMW:132022-06-17 00:36:12.111 INFO  打木箱 【http-nio-8081-exec-3】【Wooden:132022-06-17 00:36:12.111 INFO  Item: 宝马,Packing: Wooden,Price: 560000.0 【http-nio-8081-exec-3】【Buy:442022-06-17 00:36:12.112 INFO  捷安特自行车 【http-nio-8081-exec-3】【Giant:162022-06-17 00:36:12.112 INFO  打纸箱 【http-nio-8081-exec-3】【Carton:132022-06-17 00:36:12.112 INFO  Item: 捷安特,Packing: Carton,Price: 2500.0 【http-nio-8081-exec-3】【Buy:442022-06-17 00:36:12.113 INFO  总花费: 562500.0 【http-nio-8081-exec-3】【DesignController:482022-06-17 00:36:12.113 INFO  ================= 奔驰美利达 ================= 【http-nio-8081-exec-3】【DesignController:492022-06-17 00:36:12.113 INFO  奔驰汽车 【http-nio-8081-exec-3】【Benz:132022-06-17 00:36:12.113 INFO  打木箱 【http-nio-8081-exec-3】【Wooden:132022-06-17 00:36:12.114 INFO  Item: 奔驰,Packing: Wooden,Price: 420000.0 【http-nio-8081-exec-3】【Buy:442022-06-17 00:36:12.114 INFO  美利达自行车 【http-nio-8081-exec-3】【Merida:162022-06-17 00:36:12.114 INFO  打纸箱 【http-nio-8081-exec-3】【Carton:132022-06-17 00:36:12.114 INFO  Item: 美利达,Packing: Carton,Price: 2700.0 【http-nio-8081-exec-3】【Buy:442022-06-17 00:36:12.115 INFO  总花费: 422700.0 【http-nio-8081-exec-3】【DesignController:52】
  • 相关阅读:
    [NPM] Avoid Duplicate Commands by Calling one NPM Script from Another
    [Algorithm] Dynamic programming: Find Sets Of Numbers That Add Up To 16
    [React] Refactor a Class Component with React hooks to a Function
    [Algorithm] Construct a Binary Tree and Binary Search
    设计模式(装饰者模式)
    IOS设计模式之二(门面模式,装饰器模式)
    IOS设计模式之三(适配器模式,观察者模式)
    linux内核源码阅读之facebook硬盘加速flashcache之五
    IOS设计模式之四(备忘录模式,命令模式)
    DRP总结
  • 原文地址:https://www.cnblogs.com/hikoukay/p/16384241.html
Copyright © 2020-2023  润新知