设计模式之建造者模式

1、将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

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

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例 :1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。2、JAVA 中的 StringBuilder。

优点 :1、建造者独立,易扩展。2、便于控制细节风险。

缺点:1、产品必须有共同点,范围有限制。2、如内部变化复杂,会有很多的建造类。

使用场景 :1、需要生成的对象具有复杂的内部结构。2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

实例:

1、创建功能明细总类:如食物的名称 食物的价格

public interface Item {

    String name();

    float price();

    public String pack();

}

2、创建各种食物 实现明细总类,设置不同明细数据

public class 可乐 implements Item {
    @Override
    public String name() {
        return "我是可乐";
    }

    @Override
    public float price() {
        return 20;
    }

    @Override
    public String pack() {
        return "我是杯子装";
    }
}
public class 汉堡包 implements Item {
    @Override
    public String name() {
        return "我是汉堡包";
    }

    @Override
    public float price() {
        return 10;
    }

    @Override
    public String pack() {
        return "我用袋子装";
    }
}
public class 鸡腿 implements Item {
    @Override
    public String name() {
        return "我是鸡腿";
    }

    @Override
    public float price() {
        return 30;
    }

    @Override
    public String pack() {
        return "我用手拿";
    }
}

3、设计一个结果输出类

public class 销售计算类 {

    private List<Item> list = new ArrayList<>();

    //增加商品
    public void addItem(Item item) {
        list.add(item);
    }


    //计算价格
    public void sumMoney() {
        float totalMoney = 0f;
        for (Item item : list) {
            System.out.println("食物价格:"+item.price());
            System.out.println("食物名称:"+item.name());
            totalMoney = totalMoney+item.price();
        }
        System.out.println("套餐总价格:"+totalMoney);
    }
}

4、设计各种建造模式 组合不同的基础类 ,并且调用结果输出类输出结果

public class 套餐 {

    public  void 套餐1(){
        //可乐加汉堡
        销售计算类 销售计算类 = new 销售计算类();
        销售计算类.addItem(new 可乐());
        销售计算类.addItem(new 汉堡包());
        销售计算类.sumMoney();
    }

    public  void 套餐2(){
        //鸡腿加汉堡
        销售计算类 销售计算类 = new 销售计算类();
        销售计算类.addItem(new 鸡腿());
        销售计算类.addItem(new 汉堡包());
        销售计算类.sumMoney();
    }


    public  void 套餐3(){
        //可乐加汉堡加鸡腿
        销售计算类 销售计算类 = new 销售计算类();
        销售计算类.addItem(new 可乐());
        销售计算类.addItem(new 汉堡包());
        销售计算类.addItem(new 鸡腿());
        销售计算类.sumMoney();
    }
}

5、调用测试

public class 测试建造者模式 {

    public static void main(String[] args) {
        套餐 套餐 = new 套餐();
        //套餐.套餐1();
        //套餐.套餐2();
        套餐.套餐3();
    }
}

输出:

食物价格:20.0
食物名称:我是可乐
食物价格:10.0
食物名称:我是汉堡包
食物价格:30.0
食物名称:我是鸡腿
套餐总价格:60.0

 

public class 测试建造者模式 {

public static void main(String[] args) {
套餐 套餐= new 套餐();
//套餐.套餐1();
//套餐.套餐2();
套餐.套餐3();
}
}
posted on 2021-09-11 17:14  0027014302yoyoyo  阅读(35)  评论(0)    收藏  举报