1.意图
将一个复杂对象和它的表示分离,使得同样的构建过程可以创建不同的表示
2.参与者
Builder -为创建product对象的各个部件提供接口
ConcreteBuilder -实现Builder的接口以构造和装配该产品
-定义并明确它所创建的表示
-提供一个检索产品的接口
Director - 构造使用一个Builder接口的对象
Product - 表示被构造的复杂对象,ConcreteBuilder创建该产品的内部表示
并定义该产品的装配过程
- 包含定义组成部件的类,包括将这些部件装配成产品的接口
3.相关模式AbstractFactory和Builder模式都可以创建复杂对象,区别在于AbstractFactory
着重于多个产品系列对象的创建,产品对象一步返回,而Builder着重于一步一步的构建产品,
在最后一步返回产品。
4.结构
代码:
public interface builder {
void number(int i);
void letter(String letter);
void other(String other);
}
public class concreteBuilder1 implements builder {
private product cipher = new product();
@Override
public void number(int i) {
int out = (i + 5) % 10;
cipher.setResult(cipher.getResult() + out);
}
@Override
public void letter(String letter) {
int out = Integer.parseInt(letter, 16);
cipher.setResult(cipher.getResult() + out);
}
@Override
public void other(String other) {
byte[] init = other.getBytes();
String sb = "";
for (int i = 0; i < init.length;i++) {
int value = init[i]|0x7F;
init[i] = (byte) value;
sb+=String.valueOf(init[i]);
}
cipher.setResult(cipher.getResult() + sb);
}
public product result() {
return cipher;
}
}
public class director {
public void builder(String c,builder b){
char[] ca = c.toCharArray();
for(char ch:ca){
if('0'<=ch&&ch<='9'){
b.number(ch);
}else if(('A'<=ch&&ch<='Z')||('a'<=ch&&ch<='z')){
b.letter(ch+"");
}else{
b.other(ch+"");
}
}
}
}
public class product {
private String result = "";
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
}
public class Client {
public static void main(String[] args) {
concreteBuilder1 builder = new concreteBuilder1();
director director = new director();
director.builder("1A$",builder);
System.out.println(builder.result().getResult());
}
}
解释一下:字符串有数字,字母和其它类型的字符,通过不同的builder进行重新构造成新的字符串,builder类针对不同的字符类型进行不同的改造的接口,concreteBuilder1 实现了具体改造策略,定义了具体产品和装配过程,director 导向器完成了的产品构造过程,product就是产品的表示。