设计模式---建造者模式

建造者模式

建造者模式属于创建型模式的的一种。我们可以使用多个简单的对象逐步构建成复杂的对象,Builder类会慢慢的构造成最终的对象,该Builder类是独立于其他对象。

什么时候会用到建造者模式? 通常当一些基本物料不会变,其组合经常改变的时候,这既可以当成优点,也可以当成缺点。建造者模式满足单一职责原则和可复用性,建造者之间相对独立。但是随着物料以及组合逐渐增多,维护起来会相对麻烦。

在日常生活中,新房子的装修风格,肯德基麦当劳的汉堡套餐,或者是星巴克的下午茶套餐,这些例子的物料通常是固定, 可以通过组合产生不同的套餐。

在星巴克下午茶套餐中,分别包含了咖啡和蛋糕,它们都有不同的种类,包装和价格,我们可以通过对不同种类的咖啡和蛋糕进行组合来实现建造者模式。

星巴克套餐实现建造者模式:

//套餐接口
public interface Item {

    String name();

    Package packaging();

    float price();

}

//包装接口
public interface Package {

    String packaging();
}

紧接着我们对不同物品的包装进行定义

//瓶子
public class Bottle implements Package {
    @Override
    public String packaging() {
        return "Bottle";
    }
}

//盒子
public class Wrapper implements Package {
    @Override
    public String packaging() {
        return "Wrapper";
    }
}

定义好包装的接口后,我们需要对物品进行定义

//拿铁咖啡
public class Latte extends Coffee {
    @Override
    public String name() {
        return "Latte";
    }

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

//卡布奇诺
public class Cappuccino extends Coffee {
    @Override
    public String name() {
        return "Cappuccino";
    }

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

//汤圆蛋糕
public class Socake extends Cake {
    @Override
    public String name() {
        return "Socake";
    }

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

//草莓蛋糕
public class StrawberryCake extends Cake {
    @Override
    public String name() {
        return "StrawberryCake";
    }

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

这些商品可以组成不同的套餐,接下来创建套餐

public class Order {
    //订单存放coffee 和 cake
    private List<Item> itemList = new ArrayList<>();

    //商品添加到套餐中
    public void add(Item item){
        itemList.add(item);
    }
    //获取总价
    public float getTotal(){
        float total = 0;
        for (Item i: itemList) {
            total += i.price();
        }
        return total;
    }
    //打印订单
    public void print(){
        for (Item item : itemList) {
            System.out.print("Item : "+item.name());
            System.out.print(", Packing : "+item.packaging().packaging());
            System.out.println(", Price : "+item.price());
        }
    }
}

创建Builder类

//创建套餐Builder
public class OrderBuilder {

    //汤圆蛋糕配卡布奇诺套餐
    public Order SoCake_Cappuccino(){
        Order order = new Order();
        order.add(new Cappuccino());
        order.add(new Socake());
        return order;
    }
    
    //拿铁配草莓蛋糕套餐
    public Order Strawberry_Latte(){
        Order order = new Order();
        order.add(new StrawberryCake());
        order.add(new Latte());
        return order;
    }
    
    //汤圆蛋糕配拿铁套餐
    public Order SoCake_Latte(){
        Order order = new Order();
        order.add(new Socake());
        order.add(new Latte());
        return order;
    }
}

//根据多种物料可以进行多种组合

最后创建测试类进行测试

//测试类测试
public class BuilderPatternTest{

    public static void main(String[] args) {
        OrderBuilder orderBuilder = new OrderBuilder();
        Order Socake_Latte = orderBuilder.SoCake_Latte();
        Socake_Latte.print();
        System.out.println("Total Price:" + Socake_Latte.getTotal());
    }
}

//输出结果
//Item : Socake, Packing : Wrapper, Price : 35.0
//Item : Latte, Packing : Bottle, Price : 32.0
//Total Price:67.0

优点:

1.良好的封装性,建造者模式使得客户端无需知道产品的构建过程和组成部分,符合设计原则中的迪米特法则。
2.建造者易扩展同时也相对独立。

总结:所谓建造者模式,就是通过Builder类来创建我们需要的复杂的对象,这些细节是被我们所隐蔽的。如果一个对象内部的创建非常复杂,这时可以考虑使用建造者模式,相反,如果比较简单,就不需要使用建造者模式, 不要为了设计模式而硬凑设计模式,可能会适得其反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值