建造者模式(Builder Pattern)
建造者模式:使用多个简单对象一步步构建成一个复杂的对象。
有时候,我们会创建一个“复杂”的对象,这个对象的由很多子对象构成,由于需求的变化,这个对象的各个部分经常面临剧烈的变化。
继续工厂模式的披萨店案例,现在披萨店要推出套餐服务,一个套餐(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<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.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();
}

建造者模式(Builder Pattern)的更多相关文章
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
		本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ... 
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
		原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ... 
- 【设计模式】建造者模式 Builder Pattern
		前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ... 
- 建造者模式(Builder Pattern)
		建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ... 
- 二十四种设计模式:建造者模式(Builder Pattern)
		建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ... 
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
		转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ... 
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
		说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ... 
- Net设计模式实例之建造者模式(Builder Pattern)
		一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ... 
- Python 设计模式之建造者模式   Builder Pattern
		#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ... 
- 设计模式 - 建造者模式 Builder Pattern
		简介 场景 在创建复杂对象时,用户无须关心该对象所包含的属性以及它们的组装方式,只需要指定复杂对象的类型和内容就可以构建它们. 模式定义 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程 ... 
随机推荐
- 解决SenTestingKit/SenTestingKit.h: No such file or directory
			在一个iOS项目中引入了单元测试,感觉项目间的依赖关系有些乱,就建了一个新的Project,再把原来的.h和.m加进去,编译时竟然出现“SenTestingKit/SenTestingKit.h: N ... 
- Android设计模式系列-组合模式
			Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式,Compos ... 
- 如何使得VIM显示行号
			如何使得VIM显示行号: :set number 
- 一个仿 github for windows 及 windows 8 的进度条
			https://github.com/wly2014/ProgressBar 
- Vim文本编辑器 指令簿(二)
			常常处理文本以及常常须要写代码的人,都会有自己比較常常使用的编辑器,本人喜欢用Vim.理由就是Vim编辑器灵活,而且能够达到纯键盘操作,使用纯熟情况下,根本不须要鼠标操作.听起来是不是非常酷的?只是别 ... 
- ios开发——实用技术OC-Swift篇&触摸与手势识别
			iOS开发学习之触摸事件和手势识别 iOS的输入事件 触摸事件 手势识别 手机摇晃 一.iOS的输入事件 触摸事件(滑动.点击) 运动事件(摇一摇.手机倾斜.行走),不需要人为参与的 远程控制 ... 
- android学习日记0--开发需要掌握的技能
			一.开发android,我们需要哪些技能基础 1.Java基础知识 2.Linux基础知识 3.数据库基础知识 4.网络协议 5.Android基础知识 6.服务器端开发知识 1.Java基础知识 很 ... 
- android131 360 04  手机安全页面
			## Root权限 ## > 什么是Root权限? Root权限相当于系统管理员权限, 有了root权限,就可以随意修改和删除手机内部的文件. > 一般手机购买之后, 都没有root权限. ... 
- PHP端验证代码、后端验证
			/** * 验证url是否存在 * @param string $url url路径 * @return boolean true:存在,false:不存在 */ public function va ... 
- 在android的spinner中,实现取VALUE值和TEXT值
			为了实现在android的spinner实现取VALUE值和TEXT值,我尝试过好些办法,在网上查的资料,都是说修改适配器,刚开始我也是通过修改适配器的方法来做的,但是如果一个activity有多个s ... 
