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