java与模式 生成器_java 设计模式之生成器模式

生成器模式:将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示(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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值