zoukankan      html  css  js  c++  java
  • 04 【建造型】建造者模式 浅谈理解与使用

    建造者模式

    大白话:将一个庞大的系统拆分成小份、小份之间互不影响、小份有者同样的制造过程,这就是建造者模式

    举个例子:

    我们去肯德基吃快餐, 肯定有它店铺的套餐可以供我们选择,套餐就是庞大的系统,套餐里面最简单的有:汉堡、饮料(组成小份),他们可以任意搭配组成不同的价格

    小份有着相同的制造过程,比如汉堡用纸盒包装/饮料用瓶子包装,这里的包装就是建造过程。

    何时使用:一些基本部件不会变,而其组合经常变化的时候。

    灵魂画师 go~

    测试代码:

    //一个商品的超类接口

    //单品接口
    public interface Item {
    
        //单品名称
        String name();
    
        //价格
        Double price();
    
        //打包方式
        Packing pack();
    
    }

    //商品有各自的打包方式 创建一个打包的接口

    //包装方式
    public interface Packing {
    
        //打包方式
        String packing();
    
    }

    // 汉堡实现商品的接口 并且完善自己的打包方式;

    public class Hanbao implements Item {
    
        @Override
        public String name() {
            return "汉堡";
        }
    
        @Override
        public Double price() {
            return 21.00;
        }
    
        @Override
        public Packing pack() {
            return new HeZhuang();
        }
    }

    //汉堡是盒装

    public class HeZhuang implements Packing {
    
        @Override
        public String packing() {
            return "盒装";
        }
    }

    //可乐实现商品接口

    public class Kele implements Item {
    
        @Override
        public String name() {
            return "可乐";
        }
    
        @Override
        public Double price() {
            return 5.00;
        }
    
        @Override
        public Packing pack() {
            return new PingZhuang();
        }
    }

    //可乐独有的打包方式

    public class PingZhuang implements Packing {
    
        @Override
        public String packing() {
            return "瓶装";
        }
    }

    //建造者模式提供一个菜单组合 用于组合想要的单品组成套餐

    public class ItemList {
    
        private List<Item> list = new ArrayList<>();
    
        //增加一个套餐
        public void addItem(Item item){
            list.add(item);
        }
    
        //组合总价
        public Double getPrice(){
    
            Double price = 0.00;
    
            for (Item item : list) {
                price+= item.price();
            }
            return price;
        }
        //组合详情
        public void detail() {
            for (Item item : list) {
    
                System.out.print(item.name()+"-->");
                System.out.print(item.price()+"-->");
                System.out.print(item.pack().packing()+"-->");
            }
    
        }
    
    }

    //开始测试

    public class Main {
    
        public static void main(String[] args) {
            System.out.print(no1().getPrice());
            no1().detail();
            System.out.println("");
            no2().detail();
            System.out.print(no2().getPrice());
    
    
        }
    
        //套餐一 汉堡2 + 可乐1
        public static ItemList no1(){
    
            Hanbao hanbao = new Hanbao();
            Hanbao hanbao2 = new Hanbao();
    
            Kele kele = new Kele();
    
            ItemList list = new ItemList();
    
            list.addItem(hanbao);
            list.addItem(hanbao2);
            list.addItem(kele);
    
            return list;
        }
    
    
        //套餐二 汉堡1 + 可乐2
        public static ItemList no2(){
    
            Hanbao hanbao = new Hanbao();
    
            Kele kele = new Kele();
            Kele kele2 = new Kele();
    
            ItemList list = new ItemList();
    
            list.addItem(hanbao);
            list.addItem(kele2);
            list.addItem(kele);
    
            return list;
        }
    
    }

    这里用连个方法组合了两个套餐,这就是建造者模式 ,

    参考:https://www.runoob.com/design-pattern/builder-pattern.html

    码云:https://gitee.com/mrc1999/23GOF

  • 相关阅读:
    每日一题
    每日一题
    每日一题
    每日一题
    GitLab 部署
    Golang Web开发之Gin入门
    Golang消息队列之NSQ
    Golang操作Redis
    Golang操作MySQL
    Golang Json数据处理方法
  • 原文地址:https://www.cnblogs.com/ChromeT/p/11795057.html
Copyright © 2011-2022 走看看