建造者模式是一种创建型模式,主要特点是通过逐步添加单体对象形成一个复杂的对象。
主要解决:向复杂对象中添加多个单体对象的问题。复杂对象类似一个集合,包含多个单体对象,所以存在非常多的变化。单体对象则为确定的不变的对象。通过建造者模式,将变与不变分开
如何解决:复杂对象类似一个容器,向其中添加单体对象。对于单体对象,最高层实现相同的Item接口(即所有的具体的对象具有共同的特点)。
关键代码:所有单体对象具有相同特点(实现相同接口)。建造者的建造方法。
应用实例: 1、Java中StringBuilder的实现。2、肯德基点餐,餐对象中包含薯条汉堡等元素对象无限组合。3、淘宝购物车中添加商品。
优点: 建造者只需要关注建造方法,单一职责。
缺点:单体产品必须具有某些相同的特点。
这里举一个购物的例子。光棍节已经变成了购物的盛会,用户会向购物车(复杂对象)中添加(构建)各种商品(单体对象),然后在1111当天进行结算并显示所有订单的信息(单体对象的共同特征)。当用户(建造者)在购物的时候,不需要关注商品是如何组合的,而只需要向购物车进行添加(构建)即可。
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