生成器模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
一 、 概述
当系统准备为用户提供一个内部结构复杂的对象时,就可以使用生成器模式,使用该模式可以逐步地构造对象,使得对象的创建更具弹性。生成器模式的关键是将一个包含有多个组件对象的创建分成若干个步骤,并将这些步骤封装在一个称作生成器的接口中
二、生成器模式的结构与使用
模式的结构中包括四种角色:
1.产品(Product): PanelProduct.java
import javax.swing.*;
public class PanelProduct extends JPanel{
JButton button;
JLabel label;
JTextFieldtextField;
}
2.抽象生成器(Builder): Builer.java
import.javax.swing.*;
public interface Builder{
public abstractvoid buildButton();
public abstractvoid buildLabel();
public abstractvoid buildTextField();
public abstract JPanelgetPanel();
}
3.具体生成器(ConcreteBuilder)_1:ConcreteBuilderOne.java
import javax.swing.*;
public class ConcreteBuilderOne implementsBuilder{
private PanelProduct panel;
ConcreteBuilderOne(){
panel=new PanelProduct();
}
public void buildButton(){
panel.button=new JButton("按钮");
}
public void buildLabel(){
panel.label=new JLabel("标签");
}
public void buildTextField(){
panel.textField=new JTextField("文本框");
}
public JPanel getPanel(){
panel.add(panel.button);
panel.add(panel.label);
panel.add(panel.textField);
return panel;
}
}
3.具体生成器(ConcreteBuilder)_2:ConcreteBuilderTwo.java
import javax.swing.*;
public class ConcreteBuilderTwo implementsBuilder{
private PanelProduct panel;
ConcreteBuilderTwo(){
panel=new PanelProduct();
}
public void buildButton(){
panel.button=new JButton("button");
}
public void buildLabel(){
panel.label=new JLabel("label");
}
public void buildTextField(){
panel.textField=new JTextField("textField");
}
public JPanel getPanel(){
panel.add(panel.textField);
panel.add(panel.label);
panel.add(panel.button);
return panel;
}
}
4.指挥者(Director):Director.java
import javax.swing.*;
public class Director{
private Builder builder;
Director(Builder builder){
this.builder=builder;
}
public JPanelconstructProduct(){
builder.buildButton();
builder.buildLabel();
builder.buildTextField();
JPanel product=builder.getPanel();
return product;
}
}
5.应用 Application.java
import javax.swing.*;
public classApplication{
public static void main(String args[]){
Builder builder=new ConcreteBuilderOne();
Director director=newDirector(builder);
JPanel panel=director.constructProduct();
JFrameframeOne=new JFrame();
frameOne.add(panel);
frameOne.setBounds(12,12,200,120);
frameOne.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frameOne.setVisible(true);
builder=new ConcreteBuilderTwo();
director=new Director(builder);
panel=director.constructProduct();
JFrameframeTwo=new JFrame();
frameTwo.add(panel);
frameTwo.setBounds(212,12,200,120);
frameTwo.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frameTwo.setVisible(true);
}
}三、生成器模式的优点