博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
建造者模式(Builder Pattern)
阅读量:6072 次
发布时间:2019-06-20

本文共 2930 字,大约阅读时间需要 9 分钟。

建造者模式:使用多个简单对象一步步构建成一个复杂的对象。

有时候,我们会创建一个“复杂”的对象,这个对象的由很多子对象构成,由于需求的变化,这个对象的各个部分经常面临剧烈的变化。

 

继续工厂模式的披萨店案例,现在披萨店要推出套餐服务,一个套餐(Meal)包含:披萨、饮料,披萨可以是芝士披萨(Cheese Pizza)、素食披萨(Veggie Pizza)等,披萨是包在盒子(Box)里,饮料可以是可口可乐(Coke)、橙汁(Orange)等,饮料装在杯子(Cup)里。

 

我们将创建一个表示食物的条目(包括披萨和饮料)的Item接口和实现Item接口的实体类(Pizza和Drink),以及一个表示装食物容器的Packing接口和实现Packing接口的实体类(Box和Cup),然后创建一个Meal类,该类有一个Item类型的ArrayList来放入套餐,以及一个MealBuilder来提供不同套餐。

Item.java

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

Packing.java

public interface Packing {    public String pack();}

Box实现Packing容器接口

public class Box implement Packing {    public String pack() {        return "Box";    }}

Cup同样实现Packing容器接口

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

Pizza实现Item接口,声明为抽象类,因为有不同种类的Pizza

public abstract class Pizza implements Item {    public Packing packing() {        return new Box();    }   public abstract float price();}

Drink实现Item接口,声明为抽象类,因为有不同种类的Drink

public abstract class Drink implements Item {    public Packing packing() {        return new Cup();    }    public abstract float price(); }

CheesePizza.java,Veggie就不写了,跟CheesePizza一样

public CheesePizza extends Pizza {    public float price() {        return 20.0f;    }    public String name() {        return "Cheese Pizza";    }}

Coke.java,Orange就不写了,跟Coke一样

public class Coke extends Drink {    public float price() {        return 7.0f;    }    public String name() {        return "Coke";    }}

Meal.java

public class Meal {    private List
items = new ArrayList
(); 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.print("Item :" + item.name()); System.out.print(",Packing : :" + item.packing()); System.out.println(",Price :" + item.price()); } System.out.printlln("Total cost :" + this.getCost()); }}

MealBuilder.java负责创建Meal对象

public class MealBuilder {        public Meal prepareCheesePizza() {        Meal meal = new Meal();        meal.addItem(new CheesePizza());        meal.addItem(new Coke());        return meal;    }        public Meal prepareVeggiePizza() {        Meal meal = new Meal();        meal.addItem(new VeggiePizza());        meal.addItem(new Orange());        return meal;    }}

工作已经完成,可以使用MealBuilder了

public static void main(String[] args) {    MealBuilder mb = new MealBuilder();        Meal cheesePizza = mealBuilder.prepareCheesePizza();    System.out.println("Cheese Pizza");    cheesePizza.showItem();        Meal veggiePizza = mealBuilder.prepareVeggiePizza();    veggiePizza.showItem();}

 

 

转载于:https://www.cnblogs.com/13jhzeng/p/5277766.html

你可能感兴趣的文章
需要学的东西
查看>>
Internet Message Access Protocol --- IMAP协议
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>
dom4j解析xml文件
查看>>
第六周
查看>>
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>
微软职位内部推荐-Senior Software Engineer II-Sharepoint
查看>>
sql 字符串操作
查看>>
【转】Android布局优化之ViewStub
查看>>
网络安全管理技术作业-SNMP实验报告
查看>>
根据Uri获取文件的绝对路径
查看>>
Fundebug前端JavaScript插件更新至1.6.0,新增test()方法用于测试
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>