1、将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例 :1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。2、JAVA 中的 StringBuilder。
优点 :1、建造者独立,易扩展。2、便于控制细节风险。
缺点:1、产品必须有共同点,范围有限制。2、如内部变化复杂,会有很多的建造类。
使用场景 :1、需要生成的对象具有复杂的内部结构。2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
实例:
1、创建功能明细总类:如食物的名称 食物的价格
public interface Item { String name(); float price(); public String pack(); }
2、创建各种食物 实现明细总类,设置不同明细数据
public class 可乐 implements Item { @Override public String name() { return "我是可乐"; } @Override public float price() { return 20; } @Override public String pack() { return "我是杯子装"; } }
public class 汉堡包 implements Item { @Override public String name() { return "我是汉堡包"; } @Override public float price() { return 10; } @Override public String pack() { return "我用袋子装"; } }
public class 鸡腿 implements Item { @Override public String name() { return "我是鸡腿"; } @Override public float price() { return 30; } @Override public String pack() { return "我用手拿"; } }
3、设计一个结果输出类
public class 销售计算类 { private List<Item> list = new ArrayList<>(); //增加商品 public void addItem(Item item) { list.add(item); } //计算价格 public void sumMoney() { float totalMoney = 0f; for (Item item : list) { System.out.println("食物价格:"+item.price()); System.out.println("食物名称:"+item.name()); totalMoney = totalMoney+item.price(); } System.out.println("套餐总价格:"+totalMoney); } }
4、设计各种建造模式 组合不同的基础类 ,并且调用结果输出类输出结果
public class 套餐 { public void 套餐1(){ //可乐加汉堡 销售计算类 销售计算类 = new 销售计算类(); 销售计算类.addItem(new 可乐()); 销售计算类.addItem(new 汉堡包()); 销售计算类.sumMoney(); } public void 套餐2(){ //鸡腿加汉堡 销售计算类 销售计算类 = new 销售计算类(); 销售计算类.addItem(new 鸡腿()); 销售计算类.addItem(new 汉堡包()); 销售计算类.sumMoney(); } public void 套餐3(){ //可乐加汉堡加鸡腿 销售计算类 销售计算类 = new 销售计算类(); 销售计算类.addItem(new 可乐()); 销售计算类.addItem(new 汉堡包()); 销售计算类.addItem(new 鸡腿()); 销售计算类.sumMoney(); } }
5、调用测试
public class 测试建造者模式 { public static void main(String[] args) { 套餐 套餐 = new 套餐(); //套餐.套餐1(); //套餐.套餐2(); 套餐.套餐3(); } }
输出:
食物价格:20.0 食物名称:我是可乐 食物价格:10.0 食物名称:我是汉堡包 食物价格:30.0 食物名称:我是鸡腿 套餐总价格:60.0
public class 测试建造者模式 {
public static void main(String[] args) {
套餐 套餐= new 套餐();
//套餐.套餐1();
//套餐.套餐2();
套餐.套餐3();
}
}
浙公网安备 33010602011771号