Builder解决的问题
Builder(生成器)的模式用于用多个部件生成不同产品的问题:
它适用于:
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;
当构造过程必须允许被构造的对象有不同的表示时。
Builder模式详解
在该模式中,Builder定义了一个抽象接口,用于创建Product对象的各部分
Concretebuilder实现了Builder, 提供了一个接口来创建产品Director使用Builder接口构造复杂的对象<Product代表了需要构建的复杂对象<
下面我们来看段把RTF转换成ASCII码的代码:
</pre><pre name="code" class="java">//Abstract Builder
class abstract class TextConverter{
abstract void convertCharacter(char c);
abstract void convertParagraph();
}
// Product
class ASCIIText{
public void append(char c){ //Implement the code here }
}
//Concrete Builder
class ASCIIConverter extends TextConverter{
ASCIIText asciiTextObj;//resulting product
/*converts a character to target representation and appends to the resulting (把字符装换成目标格式,然后添加到字串的末尾*/
object void convertCharacter(char c){
char asciiChar = new Character(c).charValue();
//gets the ascii character
asciiTextObj.append(asciiChar);
}
void convertParagraph(){}
ASCIIText getResult(){
return asciiTextObj;
}
}
//This class abstracts the document object (document抽象类)
class Document{
static int value;
char token;
public char getNextToken(){
//Get the next token
return token;
}
}
//Director
class RTFReader{
private static final char EOF='0'; //Delimitor for End of File 文件终止符
final char CHAR='c';
final char PARA='p';
char t;
TextConverter builder;
RTFReader(TextConverter obj){
builder=obj;
}
void parseRTF(Document doc){
while ((t=doc.getNextToken())!= EOF){
switch (t){
case CHAR: builder.convertCharacter(t);
case PARA: builder.convertParagraph();
}
}
}
}
//Client
public class Client{
void createASCIIText(Document doc){
ASCIIConverter asciiBuilder = new ASCIIConverter();
RTFReader rtfReader = new RTFReader(asciiBuilder); //此处用了asciiBuilder这个实现类
rtfReader.parseRTF(doc);
ASCIIText asciiText = asciiBuilder.getResult();
}
public static void main(String args[]){
Client client=new Client();
Document doc=new Document();
client.createASCIIText(doc);
system.out.println("This is an example of Builder Pattern");
}
}
还有一个建房子的例子:
public interface HousePlan {
public void setBasement(String basement);
public void setStructure(String structure);
public void setRoof(String roof);
public void setInterior(String interior);
}
public class House implements HousePlan { //Product角色
private String basement;
private String structure;
private String roof;
private String interior;
public void setBasement(String basement) {
this.basement = basement;
}
public void setStructure(String structure) {
this.structure = structure;
}
public void setRoof(String roof) {
this.roof = roof;
}
public void setInterior(String interior) {
this.interior = interior;
}
}
public interface HouseBuilder { //Builder角色
public void buildBasement();
public void buildStructure();
public void bulidRoof();
public void buildInterior();
public House getHouse();
}
public class IglooHouseBuilder implements HouseBuilder { //ConcreteBuilder角色
private House house;
public IglooHouseBuilder() {
this.house = new House();
}
public void buildBasement() {
house.setBasement("Ice Bars");
}
public void buildStructure() {
house.setStructure("Ice Blocks");
}
public void buildInterior() {
house.setInterior("Ice Carvings");
}
public void bulidRoof() {
house.setRoof("Ice Dome");
}
public House getHouse() {
return this.house;
}
}
public class CivilEngineer { //Director角色
private HouseBuilder houseBuilder;
public CivilEngineer(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}
public House getHouse() {
return this.houseBuilder.getHouse();
}
public void constructHouse() {
this.houseBuilder.buildBasement();
this.houseBuilder.buildStructure();
this.houseBuilder.bulidRoof();
this.houseBuilder.buildInterior();
}
}
public class BuilderSample { //测试
public static void main(String[] args) {
HouseBuilder iglooBuilder = new IglooHouseBuilder();
CivilEngineer engineer = new CivilEngineer(iglooBuilder);
engineer.constructHouse();
House house = engineer.getHouse();
System.out.println("Builder constructed: "+house);
}
}
builder的另外两种使用场合举例如下:
1. 车辆制造,用不同的部件制造出自行车,汽车,摩托等。
2. 学生考试,根据学生的不同情况出不同的试卷。成绩差的,用一个concretebuilder。成绩好的,用另一个concretebuilder.
源自:http://javapapers.com/design-patterns/builder-pattern/
http://www.oodesign.com/builder-pattern.html