设计模式学习笔记之生成器模式
生成器模式
封装一个产品的构造过程,并允许按步骤构造。
将一个复杂对象的构建与表示分离,使同样的构造过程可以创建不同的表示。
生成器模式结构中的四种角色:
产品(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 设计模式》