本系列的目标读者,是熟知设计模式,能够随手给出该模式的Java演示代码的程序员。
为什么产品没有抽象类
装配厂模式(builder pattern)的适用场景也是构建复杂产品,它包含多个成员变量表示的对象。例如美女是个复杂对象,由年龄(范围)、职业/profession、身高/len和肤色/complexion等数据描述。
例程 2 12抽象Builder
package creational.builder;
public abstract class MMBuilder{
public void setAge(int age){}//
public void setProfession(String profession ){}//职业
public void setSurface(String... s){};//外表
}
注意,比较伪建造者模式的例程2-9,抽象类如MMBuilder中没有定义返回产品的方法getResult()。原因是MMBuilder的两个子类分别是婚姻介绍所/MarriageBureau和画家/Painter,它们按照相同的生产流程construct()或build()以自己的方式/方法挑选或创建产品,婚姻介绍所挑选出真实的MM对象,而画家创建一个卡通或美女肖像/Portrait。
这就是[GoF·3.2.8]中回答“为什么产品没有抽象类”的原因。具体的build生产的产品差异太大,以至不构成产品族。抽象类MMBuilder并不知道最终的产品的类型,如果让它返回一个Object或某种标记接口没有意义。因而它不包含GetResult()这种工厂方法。
抽象类MMBuilder中的方法均为空方法,作用如同Java GUI中的适配器,参考[3.1]中介绍的伪适配器模式。
由于按照相同的生产流程construct()生产,因而MM和Portrait的成员变量基本相似。这些数据的构想,来自于范伟的一句台词:“二十八,白领,大个,白”。建造者模式-2
建造者模式的主要意义在于保证Director类的稳定。Director封装复杂对象的生成算法,而“算法应该独立于该对象的组成部分以及它们的装配方式”。
package creational.builder;
/**
*
* @author yqj2065
* @version 0.1
*/
public class MMDirector{
private MMBuilder builder;
public MMDirector(MMBuilder builder){
this.builder =builder;
}
public void build(int age1,int age2,String profession,String len,String complexion){
builder.setAge(age1);
builder.setAge(age2);
builder.setProfession(profession);
builder.setSurface(len,complexion);
}
}
因此,可以为Director的算法配置不同的具体builder而生成不同的对象如MM对象或肖像/Portrait对象;也可以由多个复杂对象的生成算法如Director、Director2共享同一个builder以复用对象的装配方式。
在这种建造者模式的场景中,Client要依赖Director、各种具体builder以及各种产品。
package 建造者模式;
/**
* Client.java.
*
* @author yqj2065
* @version 0.1
*/
public class Client{
public static void test(){
MarriageBureau builder = new MarriageBureau();
MMDirector director = new MMDirector(builder);
director.build(28,30,"白领","大个","白");
MM mm =builder.getMM();
mm.say();
Painter b = new Painter();
MMDirector d = new MMDirector(b);
d.build(28,30,"白领","大个","白");
Portrait mm2 =b.getPortrait();
mm2.copy();
mm2.copy();
System.out.println(mm2.toString());
}
}
输出:
我是MM,28~ 30 白领 大个 白
我是相片0
我是相片1
28 白领 大个 白
从中你要充分注意Director类的作用。建造者模式(builder pattern)的主要意义在于保证Director类的稳定,
而产品可以是标具体的建造者创建的美女对象或美女相片对象(非产品族)。装配方式由具体的建造者封装。