生成器模式 封裝一個產品的構造過程,並允許按步驟構造。 將一個複雜對象的構建與表示分離,使同樣的構造過程可以創建不同的表示。 生成器模式結構中的四種角色: 產品(Product): 所要構建的複雜對象。 抽象生成器(Builder): 抽象生成器是一個介面,該介面除了為創建一個Product對象的各 ...
生成器模式 封裝一個產品的構造過程,並允許按步驟構造。 將一個複雜對象的構建與表示分離,使同樣的構造過程可以創建不同的表示。
生成器模式結構中的四種角色:
產品(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