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


1、介绍

建造者模式是一种创建型模式,主要特点是通过逐步添加单体对象形成一个复杂的对象。

主要解决:向复杂对象中添加多个单体对象的问题。复杂对象类似一个集合,包含多个单体对象,所以存在非常多的变化。单体对象则为确定的不变的对象。通过建造者模式,将变与不变分开

如何解决:复杂对象类似一个容器,向其中添加单体对象。对于单体对象,最高层实现相同的Item接口(即所有的具体的对象具有共同的特点)。

关键代码:所有单体对象具有相同特点(实现相同接口)。建造者的建造方法。

应用实例: 1、Java中StringBuilder的实现。2、肯德基点餐,餐对象中包含薯条汉堡等元素对象无限组合。3、淘宝购物车中添加商品。

优点: 建造者只需要关注建造方法,单一职责。

缺点:单体产品必须具有某些相同的特点。


2、实现

2.1、背景

这里举一个购物的例子。光棍节已经变成了购物的盛会,用户会向购物车(复杂对象)中添加(构建)各种商品(单体对象),然后在1111当天进行结算并显示所有订单的信息(单体对象的共同特征)。当用户(建造者)在购物的时候,不需要关注商品是如何组合的,而只需要向购物车进行添加(构建)即可。


2.2、实现

1)单体对象接口(单体对象共同点)定义

public interface Item {
    String getName();
    float getPrice();
    String getUnit();
    String getExpress();
}

2)单体对象定义

public class Milk implements Item
{
    @Override
    public String getName() {
        return "牛奶";
    }

    @Override
    public float getPrice() {
        return 5f;
    }

    @Override
    public String getUnit() {
        return "盒";
    }

    @Override
    public String getExpress() {
        return "顺丰快递";
    }
}
public class Bread implements Item
{

    @Override
    public String getName() {
        return "面包";
    }

    @Override
    public float getPrice() {
        return 3f;
    }

    @Override
    public String getUnit() {
        return "个";
    }

    @Override
    public String getExpress() {
        return "圆通快递";
    }
}
public class Desk implements Item
{

    @Override
    public String getName() {
        return "桌子";
    }

    @Override
    public float getPrice() {
        return 120f;
    }

    @Override
    public String getUnit() {
        return "张";
    }

    @Override
    public String getExpress() {
        return "韵达快递";
    }
}
public class Cabbage implements Item
{
    @Override
    public String getName() {
        return "大白菜";
    }

    @Override
    public float getPrice() {
        return 0.5f;
    }

    @Override
    public String getUnit() {
        return "颗";
    }

    @Override
    public String getExpress() {
        return "申通快递";
    }
}

3)复杂对象定义

import java.util.ArrayList;
import java.util.List;

public class ShoppingCart
{
    private List<Item> cart = new ArrayList<>();

    public ShoppingCart add(Item item)
    {
        cart.add(item);
        return this;
    }

    public void printCost()
    {
        float totalCost = 0f;
        for (Item item : cart)
        {
            totalCost += item.getPrice();
        }
        System.out.println("总价:" + totalCost);
    }

    public void printItem()
    {
        for (Item item : cart)
        {
            System.out.println("名称:" + item.getName());
            System.out.println("单价:" + item.getPrice());
            System.out.println("规格:" + item.getUnit());
            System.out.println("快递:" + item.getExpress());
            System.out.println();
        }
    }
}

4)测试代码

public class Test
{
    public static void main(String[] args)
    {
        ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.add(new Milk()).add(new Bread());
        shoppingCart.printItem();
        shoppingCart.printCost();

    }
}

5)运行结果

名称:牛奶
单价:5.0
规格:盒
快递:顺丰快递

名称:面包
单价:3.0
规格:个
快递:圆通快递

总价:8.0

Process finished with exit code 0

点赞