设计模式——建造者模式

简介:

阅读目录

介绍

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。一个Buider类会一步一步的构建最终的对象,该Builder类是独立于其他对象的。

何时使用

一些基本的部件不变,而其组合经常变化的时候

如何解决

将变与不变分离开

应用实例

麦当劳里的汉堡、可乐、薯条、炸鸡等是不变的,但其组合经常变动,生成所谓的“套餐”

注意

与工厂模式相比,更加关注与零件装配的顺序

案例

快餐店案例,其中一个典型的套餐可是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chiken Burer),他们装在纸盒里;冷饮可以是可口可乐(coke)或百事可乐(pepsi),他们装在瓶子里。

我们创建一个表示食物条目(比如汉堡和冷饮)的Item接口和实现Item接口的实体类,以及一个表示食物包装的Packing接口和实现Packing接口的实体类。汉堡包在纸盒里,可乐装在瓶子里。

然后我们创建一个Meal类,带有Item的ArrayList和一个通过Item来创建不同类型的Meal对象的MealBuilder。
步骤一

创建一个表示食物条目和食物包装的接口

Item.java

public interface Item {
    public String name();
    public Packing packing();
    public float price();
}

Packing.java

public interface Packing {
    public String pack();
}

步骤二

实现Packing接口的实体类

Wrapper.java

public class Wrapper implements Packing{
    public String pack() {
        return "Wrapper";
    }
}

Bottle.java

public class Bottle implements Packing{
    public String pack() {
        return "Bottle";
    }
}

步骤三

实现Item接口的抽象类,该类提供默认的功能

Burger.java

复制代码
public abstract class Burger implements Item {
    public Packing packing(){
        return new Wrapper();
    }
    public abstract float price();
}
复制代码

ColdDrink.java

复制代码
public abstract class ColdDrink implements Item{
    public Packing packing(){
        return new Bottle();
    }
    public abstract float price();
}
复制代码

步骤四

创建扩展了Burger和ColdDrink的实体类

VegBurger.java

复制代码
public class VegBurger extends Burger{
    public float price(){
        return 25.0f;
    }
    public String name(){
        return "Veg Burger";
    }
}
复制代码

ChickBurger.java

复制代码
public class ChikenBurger extends Burger{
    public float price(){
        return 50.5f;
    }
    public String name(){
        return "Chicken Burger";
    }
}
复制代码

Cock.java

复制代码
public class Coke extends ColdDrink{
    public float price(){
        return 30.0f;
    }
    public String name(){
        return "Coke";
    }
}
复制代码

Pepsi.java

复制代码
public class Pepsi extends ColdDrink{
    public float price(){
        return 35.0f;
    }
    public String name(){
        return "Pepsi";
    }
}
复制代码

步骤五

创建一个Meal类,带有上面定义的Item对象

Meal.java

复制代码
import java.util.List;
import java.util.ArrayList;
public class Meal {
    private List<Item> items = new ArrayList<Item>();
    public void addItem(Item item){
        items.add(item);
    }
    public float getCost(){
        float cost = 0.0f;
        for (Item item: items){
            cost += item.price();
        }
        return cost;
    }
    public void showItems(){
        for (Item item: items){
            System.out.println("Item:" + item.name());
            System.out.println(", Packing:" + item.packing().pack());
            System.out.println(", Price:" + item.price());
        }
    }
}
复制代码

步骤六

创建一个MealBuilder类,实际上builder类负责创建Meal对象,下面创建了2份套餐

MealBuilder.java

复制代码
public class MealBuilder {
    public Meal prepareVegMeal(){
        Meal meal = new Meal();
        meal.addItem(new VegBurger());
        meal.addItem(new Coke());
        return meal;
    }

    public Meal prepareNonVegMeal(){
        Meal meal = new Meal();
        meal.addItem(new ChikenBurger());
        meal.addItem(new Pepsi());
        return meal;
    }
}
复制代码

步骤七

演示创建者模式

BuilderPatternDemo.java

复制代码
public class BuilderPatternDeom {
    public static void main(String []args){
        MealBuilder mealBuilder = new MealBuilder();

        Meal vegMeal = mealBuilder.prepareVegMeal();
        System.out.println("veg Meal");
        vegMeal.showItems();
        System.out.println("Total Cost:" + vegMeal.getCost());

        Meal nonVegMeal = mealBuilder.prepareNonVegMeal();
        System.out.println("mon veg Meal");
        nonVegMeal.showItems();
        System.out.println("Total Cost:" + nonVegMeal.getCost());
    }
}
复制代码

步骤八

输出

veg Meal
Item:Veg Burger
, Packing:Wrapper
, Price:25.0
Item:Coke
, Packing:Bottle
, Price:30.0
Total Cost:55.0
Disconnected from the target VM, address: '127.0.0.1:63309', transport: 'socket'
mon veg Meal
Item:Chicken Burger
, Packing:Wrapper
, Price:50.5
Item:Pepsi
, Packing:Bottle
, Price:35.0
Total Cost:85.5

  







本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/6579487.html,如需转载请自行联系原作者


相关文章
|
3月前
|
设计模式 Java 机器人
Java设计模式-建造者模式
建造者(Builder)模式指将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。它是把对象的构建和表述分离。
44 0
Java设计模式-建造者模式
|
3月前
|
设计模式
设计模式 | 建造者模式
设计模式 | 建造者模式
36 0
|
3月前
|
设计模式 Go 开发工具
Golang设计模式——04建造者模式
Golang设计模式——04建造者模式
23 0
|
6月前
|
设计模式 算法
设计模式10 - 建造者模式【Builder Pattern】
设计模式10 - 建造者模式【Builder Pattern】
16 0
|
6月前
|
设计模式 C++
设计模式之建造者模式(C++)
设计模式之建造者模式(C++)
|
4月前
|
设计模式 Java
Java设计模式【四】:建造者模式
Java设计模式【四】:建造者模式
24 0
|
5月前
|
设计模式 缓存 Java
认真学习设计模式之建造者模式(Builder Pattern)
认真学习设计模式之建造者模式(Builder Pattern)
59 1
|
6月前
|
设计模式 缓存 Java
【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——建造者模式Builder(原理讲解+应用场景介绍+案例介绍+Java代码实现)
53 0
|
12天前
|
设计模式 Java
小谈设计模式(14)—建造者模式
小谈设计模式(14)—建造者模式
|
1月前
|
设计模式 Java
设计模式之建造者模式
设计模式之建造者模式