Builder模式中的登场角色
1. Builder(建造者)
Builder角色负责定义用于生成实例的接口(API)。Builder角色中准备了用于生成实例的方法。
2. ConcreteBuilder(具体的建造者)
ConcreteBuilder 角色是负责实现Builder角色的接口的类。这里定义了在生成实例时实际被调用的方法。此外,在ConcreteBuilder 还定义了获取最终生成结果的方法。
3. Director(监工)
Director角色负责使用Builder角色的接口来生成实例。它并不依赖于ConcreteBuilder角色。为了确保不论ConcreteBuilder角色是怎么被定义的,Director角色都能正常工作,它只调用在Builder角色中被定义的方法。
代码实例
Builder角色
public abstract class Builder {
private boolean initialized=false;
public void makeTitle(String title){
if(!initialized){
buildTitle(title);
initialized=true;
}
}
public void makeString(String str){
if(initialized){
buildString(str);
}
}
public void makeItems(String[] items){
if(initialized){
buildItems(items);
}
}
public void close(){
if(initialized){
done();
}
}
protected abstract void buildTitle(String title);
protected abstract void buildString(String str);
protected abstract void buildItems(String[] items);
protected abstract void done();
}
Director 角色
public class Direcotor {
private Builder builder;
public Direcotor(Builder builder) {
// TODO Auto-generated constructor stub
this.builder=builder;
}
public void construct(){
builder.makeTitle("Greeting");
builder.makeString("从早上到下午");
builder.makeItems(new String[]{
"早上好",
"下午好"
});
builder.makeString("晚上");
builder.makeItems(new String[]{
"晚上好",
"再见"
});
builder.close();
}
}
ConcreteBuilder 角色
public class GUIBuilder extends Builder implements ActionListener{
private JFrame frame=new JFrame();
private Box box=new Box(BoxLayout.Y_AXIS);
@Override
protected void buildTitle(String title) {
// TODO Auto-generated method stub
frame.setTitle(title);
}
@Override
protected void buildString(String str) {
// TODO Auto-generated method stub
JLabel label=new JLabel(str);
box.add(label);
}
@Override
protected void buildItems(String[] items) {
// TODO Auto-generated method stub
Box inner=new Box(BoxLayout.Y_AXIS);
for(String item:items){
JButton button=new JButton(item);
inner.add(button);
button.addActionListener(this);
}
box.add(inner);
}
@Override
protected void done() {
// TODO Auto-generated method stub
frame.add(box);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println(e.getActionCommand());
}
public JFrame getResult(){
return frame;
}
}
主类
public class Main {
public static void main(String[] args){
GUIBuilder builder=new GUIBuilder();
Direcotor direcotor=new Direcotor(builder);
direcotor.construct();
JFrame frame=builder.getResult();
frame.setVisible(true);
}
}
相关的设计模式
1. Template Method 模式
在Builder模式中,Director角色控制Builder角色。
在Template Method中,父类控制子类。
2. Composite 模式
有些情况下,Builder模式生成的实例构成了Composite 模式。
3. Abstract Factory 模式
Builder模式和Abstract Factory 模式都用于生成复杂的实例
4. Facade 模式
在Builder模式中,Director角色通过组合Builder角色中的复杂方法向外部提供可以简单生成实例的接口。
而Facade模式中的Facade角色则是通过组合内部模块向外部提供可以简单调用的接口。