生成器模式:将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示(Separate the construction of a complex object from its representation so that the same construction process can create different representations)。
生成器模式结构中的四种角色。
产品(Product): 所要构建的复杂对象。
抽象生成器(Builder): 抽象生成器是一个接口,该接口除了为创建一个Product对象的各个组件定义若干个方法外,还要定义返回Product对象的方法。
具体生成器(ConcreteBuilder): 实现Buidler接口的类。
指挥者(Director): 指挥者是一个类,该类需含有Builder接口申明的变量,指挥者的职责是负责向用户提供具体的生成器,利用具体生成器构造复杂的Product对象。
代码如下:
Product类:
1 packagecn.zj.qiao.designPattern.builder;2
3 importjavax.swing.JButton;4 importjavax.swing.JLabel;5 importjavax.swing.JPanel;6 importjavax.swing.JTextField;7
8 public class PanelProduct extendsJPanel {9 /**
10 *11 */
12 private static final long serialVersionUID = 1L;13 JButton button;14 JLabel label;15 JTextField textField;16 }
Builder 接口:
1 packagecn.zj.qiao.designPattern.builder;2
3 importjavax.swing.JButton;4 importjavax.swing.JLabel;5 importjavax.swing.JPanel;6 importjavax.swing.JTextField;7
8 public class PanelProduct extendsJPanel {9 /**
10 *11 */
12 private static final long serialVersionUID = 1L;13 JButton button;14 JLabel label;15 JTextField textField;16 }
ConcreteBuilder 如下两个类(ConcreteBuilderOne和ConcreteBuilderTwo):
1 packagecn.zj.qiao.designPattern.builder;2
3
4 importjavax.swing.JButton;5 importjavax.swing.JLabel;6 importjavax.swing.JPanel;7 importjavax.swing.JTextField;8
9 public class ConcreteBuilderOne implementsBuilder {10 private PanelProduct panel; //创建需要的容器
11
12 ConcreteBuilderOne(){13 panel = newPanelProduct();14 }15 @Override16 public voidbuildButton() {17 panel.button = new JButton("btn");18
19 }20
21 @Override22 public voidbuildLabel() {23 panel.label = new JLabel("lable");24
25 }26
27 @Override28 public voidbuildTextField() {29 panel.textField = new JTextField("hello");30
31 }32
33 @Override34 publicJPanel getPanel() {35 panel.add(panel.button);36 panel.add(panel.label);37 panel.add(panel.textField);38 returnpanel;39 }40
41 }42
43
44 packagecn.zj.qiao.designPattern.builder;45
46 importjavax.swing.JButton;47 importjavax.swing.JLabel;48 importjavax.swing.JPanel;49 importjavax.swing.JTextField;50
51 public class ConcreteBuilderTwo implementsBuilder {52 privatePanelProduct panel;53
54 ConcreteBuilderTwo(){55 panel = newPanelProduct();56 }57 @Override58 public voidbuildButton() {59 panel.button = new JButton("btn");60
61 }62
63 @Override64 public voidbuildLabel() {65 panel.label = new JLabel("label");66
67 }68
69 @Override70 public voidbuildTextField() {71 panel.textField = new JTextField("helo");72
73 }74
75 @Override76 publicJPanel getPanel() {77 panel.add(panel.textField);78 panel.add(panel.label);79 panel.add(panel.button);80 returnpanel;81 }82
83 }
Director类:
1 packagecn.zj.qiao.designPattern.builder;2
3 importjavax.swing.JPanel;4
5 public classDirector {6 privateBuilder builder;7
8 Director(Builder builder){9 this.builder =builder;10 }11
12 publicJPanel constructProduct(){13 builder.buildButton();14 builder.buildLabel();15 builder.buildTextField();16 returnbuilder.getPanel();17 }18 }
下面是测试代码:
1 packagecn.zj.qiao.designPattern.builder;2
3 importjava.awt.Container;4
5 importjavax.swing.JFrame;6 importjavax.swing.JPanel;7
8 public classApplication {9 public static voidmain(String[] args){10 Builder builder = newConcreteBuilderOne();11 Director dir = newDirector(builder);12 JPanel panel =dir.constructProduct();13 JFrame frameOne = new JFrame("hello");14 Container con =frameOne.getContentPane();15 con.add(panel);16 frameOne.setBounds(12, 12, 200, 120);17 frameOne.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);18 frameOne.setVisible(true);19
20 builder = newConcreteBuilderTwo();21 dir = newDirector(builder);22 panel =dir.constructProduct();23 JFrame frameTwo = new JFrame("hello");24 con =frameTwo.getContentPane();25 con.add(panel);26 frameTwo.setBounds(222, 12, 200, 120);27 frameTwo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);28 frameTwo.setVisible(true);29
30 }31 }