Builder模式

来源:互联网 发布:centos 6.8中文输入法 编辑:程序博客网 时间:2024/06/11 18:19

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角色则是通过组合内部模块向外部提供可以简单调用的接口。

原创粉丝点击