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

概念

建造者模式(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】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值