建造者模式(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;}
}