建造者模式(BuilderPattern)
内在的核心问题就是: 使用多个简单对象根据一种组合关系构造一个我们想要的复杂对象, 属于创建型模式
- 建造者模式的角色关系
建造者模式中总共有两种角色:
1.建造者: 负责建造每个基本组件
2.指挥者: 将建造者建造好的基本组件按照某种组合关系进行拼装
- 使用方式:
建造者模式具有两部分组成: 基本组件( 维持在稳定状态,不会轻易变化 ), 基本组件之间的组合关系( 组合关系总是多变的 );
1.先将每个简单的组件类构建出来.
2.指挥者按照特定的建造顺序调用组件类对象
举个例子: 比如电脑的组装, 组装顺序是固定的, 但是组装的零件是可变的
3.在测试类中通过指挥者对象选用需要的基本组件, 构造复杂对象
优点: 基本组件独立,易扩展; 便于控制细节风险
缺点: 构建出来的复杂对象必须有公共点, 构建的范围有限制; 生成对象之间具有一定的依赖关系
注: 建造者模式与工厂模式的区别-----建造者更关注零件的装配顺序, 将一个复杂的构建过程与其表示相分离, 并不是由建造者负责一切, 而是由指挥者负责控制(定义)一个复杂的构建过程, 由各个不同的建造者分别实现构建过程所用到的构建步骤
- 下面通过一个例子说明:
基本组件: 汉堡, 冷饮, 纸盒, 瓶子
package com.BuilderPattern;
import java.util.ArrayList;
import java.util.List;
/**
* 快餐店案例, 套餐为汉堡,冷饮,包装有纸盒,瓶子
* @author regotto
*
*/
public class BuilderPattern {
//测试类
public static void main(String[] args) {
MealBuilder mb=new MealBuilder();
//测试类中负责需要的点餐内容
Meal vegMeal=mb.prepareVegMeal(new VegBurger(), new Pepsi());
vegMeal.showItems();
System.out.println("Cost: "+vegMeal.getCost());
}
}
//针对所有基本组件的接口: 名字,包装形式, 价格
interface Item{
String name();
Packing packing();
double price();
}
//指挥者: 搭配一次点餐内容
class MealBuilder{
//搭配方式是固定的, 汉堡+冷饮
public Meal prepareVegMeal(Burger b, ColdDrink cd) {
Meal meal=new Meal();
meal.addItem(b);
meal.addItem(cd);
return meal;
}
}
//一次点餐包含的基本组件(使用ArrayList存储)
class Meal{
private List<Item> items=new ArrayList<Item>();
public void addItem(Item item) {
items.add(item);
}
public double getCost() {
double cost=0.0;
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().pack());
System.out.println(", Price: "+item.price());
}
}
}
//基本组件包装的接口: 包装,包含纸盒,瓶子
interface Packing{
public String pack();
}
//包装的实现类, 汉堡使用纸盒, 冷饮使用瓶子
class Wrapper implements Packing{
public String pack() {
return "Wrapper";
}
}
class Bottle implements Packing{
public String pack() {
return "Bollte";
}
}
//抽象的汉堡组件
abstract class Burger implements Item{
public Packing packing() {
return new Wrapper();
}
}
//汉堡组件的实现类
class VegBurger extends Burger{
public String name() {
return "VegBurger";
}
public double price() {
return 10.5;
}
}
class ChickenBurger extends Burger{
public String name() {
return "ChickenBurger";
}
public double price() {
return 15.5;
}
}
//抽象冷饮的基本组件
abstract class ColdDrink implements Item{
public Packing packing() {
return new Bottle();
}
}
//冷饮的实现类
class Pepsi extends ColdDrink{
public String name() {
return "Pepsi";
}
public double price() {
return 3.50;
}
}
class Coke extends ColdDrink{
public String name() {
return "Coke";
}
public double price() {
return 5.50;
}
}