你的位置:首页 > ASP.net教程

[ASP.net教程]设计模式学习笔记之生成器模式


生成器模式
    封装一个产品的构造过程,并允许按步骤构造。
    将一个复杂对象的构建与表示分离,使同样的构造过程可以创建不同的表示。
 

    生成器模式结构中的四种角色:

    产品(Product): 所要构建的复杂对象。

    抽象生成器(Builder): 抽象生成器是一个接口,该接口除了为创建一个Product对象的各个组件定义若干个方法外,还要定义返回Product对象的方法。

    具体生成器(ConcreteBuilder): 实现Buidler接口的类。

    指挥者(Director): 指挥者是一个类,该类需含有Builder接口申明的变量,指挥者的职责是负责向用户提供具体的生成器,利用具体生成器构造复杂的Product对象。

 

    生成器的优点:

    1、将一个复杂对象的创建过程封装起来;

    2、允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个步骤的工厂模式不同);

    3、向客户隐藏产品内部的表现;

    4、产品的实现可以被替换,因为客户只看到一个抽象的接口。

 

   生成器模式的缺点:

    1、与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识;

 

   生成器模式的用途:

    1、经常被用来创建组合结构;

 

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
/**
 * 产品
 * */
public class PanelProduct extends JPanel{
 
    JButton button;
    JLabel label;
    JTextField textfield;
 
}

/**
 * 抽象生成器
 * */
public interface Builder {
 
    public void buildButton();
 
    public void buildLabel();
 
    public void buildTextField();
 
    public JPanel getPanel();
 
}

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
/**
 * 具体生成器
 * */
public class ConcreteBuilder implements Builder{
 
    private PanelProduct product;
 
    public ConcreteBuilder() {
        product = new PanelProduct();
    }
 
    public void buildButton() {
        product.button = new JButton("按钮");
    }
 
    public void buildLabel() {
        product.label = new JLabel("标签");
    }
 
    public void buildTextField() {
        product.textfield = new JTextField("文本框");
    }
 
    public JPanel getPanel() {
        product.add(product.button);
        product.add(product.label);
        product.add(product.textfield);
        return product;
    }
 
}

import javax.swing.JPanel;
 
/**
 * 指挥者
 * */
public class Director {
 
    private Builder builder;
 
    public Director(Builder builder) {
        this.builder = builder;
    }
 
    public JPanel constructProduct() {
        builder.buildButton();
        builder.buildLabel();
        builder.buildTextField();
        JPanel panel = builder.getPanel();
        return panel;
    }
 
}

import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Client {
 
    public static void main(String[] args) {
        Builder builder = new ConcreteBuilder();
        Director director = new Director(builder);
        JPanel panel = director.constructProduct();
        JFrame frame = new JFrame();
        frame.add(panel);
        frame.setBounds(12, 12, 200, 120);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
 
}
 

参考资料:《Head First 设计模式》

               http://www.cnblogs.com/binger/archive/2012/08/22/2650798.html
               http://skhero2012.iteye.com/blog/1489808