Builder模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值