zoukankan      html  css  js  c++  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 package cn.zj.qiao.designPattern.builder;
     2 
     3 import javax.swing.JButton;
     4 import javax.swing.JLabel;
     5 import javax.swing.JPanel;
     6 import javax.swing.JTextField;
     7 
     8 public class PanelProduct extends JPanel {
     9     /**
    10      * 
    11      */
    12     private static final long serialVersionUID = 1L;
    13     JButton button;
    14     JLabel label;
    15     JTextField textField;
    16 }

    Builder 接口:

     1 package cn.zj.qiao.designPattern.builder;
     2 
     3 import javax.swing.JButton;
     4 import javax.swing.JLabel;
     5 import javax.swing.JPanel;
     6 import javax.swing.JTextField;
     7 
     8 public class PanelProduct extends JPanel {
     9     /**
    10      * 
    11      */
    12     private static final long serialVersionUID = 1L;
    13     JButton button;
    14     JLabel label;
    15     JTextField textField;
    16 }

    ConcreteBuilder 如下两个类(ConcreteBuilderOne和ConcreteBuilderTwo):

     1 package cn.zj.qiao.designPattern.builder;
     2 
     3 
     4 import javax.swing.JButton;
     5 import javax.swing.JLabel;
     6 import javax.swing.JPanel;
     7 import javax.swing.JTextField;
     8 
     9 public class ConcreteBuilderOne implements Builder {
    10     private PanelProduct panel;    //创建需要的容器
    11     
    12     ConcreteBuilderOne(){
    13         panel = new PanelProduct();
    14     }
    15     @Override
    16     public void buildButton() {
    17         panel.button = new JButton("btn");
    18 
    19     }
    20 
    21     @Override
    22     public void buildLabel() {
    23         panel.label = new JLabel("lable");
    24 
    25     }
    26 
    27     @Override
    28     public void buildTextField() {
    29         panel.textField = new JTextField("hello");
    30 
    31     }
    32 
    33     @Override
    34     public JPanel getPanel() {
    35         panel.add(panel.button);
    36         panel.add(panel.label);
    37         panel.add(panel.textField);
    38         return panel;
    39     }
    40 
    41 }
    42 
    43 
    44 package cn.zj.qiao.designPattern.builder;
    45 
    46 import javax.swing.JButton;
    47 import javax.swing.JLabel;
    48 import javax.swing.JPanel;
    49 import javax.swing.JTextField;
    50 
    51 public class ConcreteBuilderTwo implements Builder {
    52     private PanelProduct panel;
    53     
    54     ConcreteBuilderTwo(){
    55         panel = new PanelProduct();
    56     }
    57     @Override
    58     public void buildButton() {
    59         panel.button = new JButton("btn");
    60 
    61     }
    62 
    63     @Override
    64     public void buildLabel() {
    65         panel.label = new JLabel("label");
    66 
    67     }
    68 
    69     @Override
    70     public void buildTextField() {
    71         panel.textField = new JTextField("helo");
    72 
    73     }
    74 
    75     @Override
    76     public JPanel getPanel() {
    77         panel.add(panel.textField);
    78         panel.add(panel.label);
    79         panel.add(panel.button);
    80         return panel;
    81     }
    82 
    83 }

    Director类:

     1 package cn.zj.qiao.designPattern.builder;
     2 
     3 import javax.swing.JPanel;
     4 
     5 public class Director {
     6     private Builder builder;
     7     
     8     Director(Builder builder){
     9         this.builder = builder;
    10     }
    11     
    12     public JPanel constructProduct(){
    13         builder.buildButton();
    14         builder.buildLabel();
    15         builder.buildTextField();
    16         return     builder.getPanel();
    17     }
    18 }

    下面是测试代码:

     1 package cn.zj.qiao.designPattern.builder;
     2 
     3 import java.awt.Container;
     4 
     5 import javax.swing.JFrame;
     6 import javax.swing.JPanel;
     7 
     8 public class Application {
     9     public static void main(String[] args){
    10             Builder builder = new ConcreteBuilderOne();
    11             Director dir = new Director(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 = new ConcreteBuilderTwo();
    21             dir = new Director(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 }
  • 相关阅读:
    Cocos2dx隐藏iOS7状态栏】通过添加Plist Key隐藏iOS7状态栏
    数论
    Large Division(大数取余模板)
    CodeForces
    2019山东第十届acm省赛 c Wandering Robot 即zoj4115
    CF1157A. Reachable Numbers
    E. Mishap in Club (CF 245E)
    ATcoder Big Array
    CF987B
    CF1013B And
  • 原文地址:https://www.cnblogs.com/binger/p/2650798.html
Copyright © 2011-2022 走看看