一 设计模式创建型模式( 七 )


关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系 。
应用实例:1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐" 。2、JAVA 中的。
优点:1、建造者独立,易扩展 。2、便于控制细节风险 。
缺点:1、产品必须有共同点,范围有限制 。2、如内部变化复杂,会有很多的建造类 。
使用场景:1、需要生成的对象具有复杂的内部结构 。2、需要生成的对象内部属性本身相互依赖 。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序 。
实现
我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡()和一杯冷饮(Cold drink) 。汉堡()可以是素食汉堡(Veg )或鸡肉汉堡( ),它们是包在纸盒中 。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中 。
我们将创建一个表示食物条目(比如汉堡和冷饮)的Item接口和实现Item接口的实体类,以及一个表示食物包装的接口和实现接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中 。
然后我们创建一个Meal类,带有Item的和一个通过结合Item来创建不同类型的Meal对象的 。,我们的演示类使用来创建一个Meal 。
步骤 1
创建一个表示食物条目和食物包装的接口 。
public interface Item {public String name();public Packing packing();public float price();}
public interface Packing {public String pack();}
步骤 2
创建实现接口的实体类 。
public class Wrapper implements Packing {@Overridepublic String pack() {return "Wrapper";}}
public class Bottle implements Packing {@Overridepublic String pack() {return "Bottle";}}
步骤 3
创建实现 Item 接口的抽象类,该类提供了默认的功能 。
public abstract class Burger implements Item {@Overridepublic Packing packing() {return new Wrapper();}@Overridepublic abstract float price();}
public abstract class ColdDrink implements Item {@Overridepublic Packing packing() {return new Bottle();}@Overridepublic abstract float price();}
步骤 4
创建扩展了和的实体类 。
public class VegBurger extends Burger {@Overridepublic float price() {return 25.0f;}@Overridepublic String name() {return "Veg Burger";}}
public class ChickenBurger extends Burger {@Overridepublic float price() {return 50.5f;}@Overridepublic String name() {return "Chicken Burger";}}
public class Coke extends ColdDrink {@Overridepublic float price() {return 30.0f;}@Overridepublic String name() {return "Coke";}}
public class Pepsi extends ColdDrink {@Overridepublic float price() {return 35.0f;}@Overridepublic String name() {return "Pepsi";}}
步骤 5
创建一个 Meal 类,带有上面定义的 Item 对象 。
import java.util.ArrayList;import java.util.List;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().pack());System.out.println(", Price : "+item.price());}}}