l Builder(抽象建造者角色):给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,有多少个组成部分就有多少个建造方法。
l BuilderImplx(具体建造者角色):担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序的调用下创建产品的实例。这个角色完成的任务包括:实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。在建造过程完成后,提供产品的实例
l Director(导演着角色):担任这个角色的类调用具体建造者角色以创建产品对象。导演者角色并没有产品类的具体知识,它只是指导特定的具体创建者对象进行创建的过程。
l 产品角色:产品便是建造过程中的复杂对象。一般来说,一个系统会有多个产品类,而且这些产品类并不一定有共同的接口。一般来说,每一个产品类都有一个相应的具体构造者类。
代码 1 Builder.java:
package com.model.BuilderFactory; import java.util.ArrayList; import java.util.List; /** *抽象创建者 */ abstract public class Builder { /* * 商品的列表 */ private List productList; public List getProductList() { return productList; } public void setProductList(List productList) { this.productList = productList; } /* * 初始化,生成新的产品列表 */ public void init(){ productList = new ArrayList(); } /* * 以下方法为创建商品部分的方法 * 注意此处不声明为抽象方法的好处是: * 如果具体子类没有某个创建方法,则会自动调用父类的空方法 * 而抽象方法则强制子类实现,造成编程上的冗余。 */ public void createFoodA(){ //空方法 } public void createFoodB(){ //空方法 } public void createDrink(){ //空方法 } public void createAddition(){ //空方法 } }
代码 2 BuilderImplA.java:
package com.model.BuilderFactory; /* * 儿童套餐 */ public class BuilderImplA extends Builder { /* * 创建主食 */ public void createFoodA(){ getProductList().add("麦香鱼汉堡"); } /* * 创建辅食 */ public void createFoodB(){ getProductList().add("小薯条"); } /* * 创建饮料 */ public void createDrink(){ getProductList().add("奶昔"); } /* * 创建附加物 */ public void createAddition(){ getProductList().add("喜洋洋玩具"); } }
代码 3 BuilderImplB.java:
package com.model.BuilderFactory; /* * 成人套餐 */ public class BuilderImplB extends Builder { /* * 创建主食 */ public void createFoodA(){ getProductList().add("巨无霸汉堡"); } /* * 创建辅食 */ public void createFoodB(){ getProductList().add("大薯条"); } /* * 创建饮料 */ public void createDrink(){ getProductList().add("大杯可乐"); } /** * 没有附加物,所以没有定义createAddition方法 * 当调用此方法时,会使用父类的方法 */ }
代码 4 Director.java:
package com.model.BuilderFactory; import java.util.List; /* * 抽象导演类 */ public abstract class Director { /* * 聚合的一个具体创建对象 */ private Builder builder; public Builder getBuilder() { return builder; } public void setBuilder(Builder builder) { this.builder = builder; } /* * 构造方法 * 传入具体的创建对象 */ public Director(Builder builder){ super(); this.builder = builder; } /* * 构建产品 */ public abstract List construct(); } |