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角色则是通过组合内部模块向外部提供可以简单调用的接口。
阅读全文
0 0
- builder 模式
- Builder模式
- Builder 模式
- Builder模式
- builder模式
- builder模式
- Builder模式
- builder模式
- Builder模式
- Builder 模式
- Builder 模式
- Builder模式
- Builder模式
- builder模式
- builder模式
- builder模式
- Builder模式
- Builder模式
- 网络<二>httpclient /httpURLConnection
- 如何判断一个数素数
- JS字符串转换成数字的三种经典方法和代码实例
- 在类的成员函数中调用delete this
- CNN笔记:通俗理解卷积神经网络
- Builder模式
- 【JavaWeb_Part04】JDBC?弱爆了,看看轻量级的 Mybatis 入门首秀
- h5 download 兼容性
- Bootstrap----tabs
- 实验见习感受
- html meta 参数详解
- 人人都应该掌握的9种数据分析思维
- Saprk aggregateByKey操作示例
- Maven 反应堆、按需构建多模块,玩转Maven反应堆(反应堆的构建顺序,裁剪反应堆)