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