ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-06-17 01:32:10  阅读:209  来源: 互联网

标签:INFO 00 return price 建造 06 设计模式 public 徒手


概念

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

 

标签:INFO,00,return,price,建造,06,设计模式,public,徒手
来源: https://www.cnblogs.com/hikoukay/p/16384241.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有