標籤:
本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,轉載請註明源地址。
建造者模式
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
概述
當系統準備為使用者提供一個內部結構複雜的對象時,就可以使用產生器模式,使用該模式可以逐步地構造對象,使得對象的建立更具彈性。產生器模式的關鍵是將一個包含有多個組件對象的建立分成若干個步驟,並將這些步驟封裝在一個稱作產生器的介面中。
適用性
1.當建立複雜物件的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。
2.當構造過程必須允許被構造的對象有不同的表示時。
參與者
1.Builder 為建立一個Product對象的各個組件指定抽象介面。
2.ConcreteBuilder 實現Builder的介面以構造和裝配該產品的各個組件。 定義並明確它所建立的表示。 提供一個檢索產品的介面。
3.Director 構造一個使用Builder介面的對象。
4.Product 表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程。 包含定義組成組件的類,包括將這些組件裝配成最終產品的介面。
建造者模式的結構與使用
模式的結構中包括四種角色:
•產品(Product)
•抽象產生器(Builder)
•具體產生器(ConcreteBuilder)
•指揮者(Director)
模式的UML類圖
實戰部分
【例1】:建立含有按鈕、標籤和文字框組件的容器。不同使用者對容器有不同的要求,比如某些使用者希望容器中只含有按鈕和標籤,某些使用者希望容器只含有按鈕和文字框等。另外使用者對組件在容器中的順序位置也有不同的要求,比如某些使用者要求組件在容器中從左至右的排列順序是按鈕、標籤、文字框,而某些使用者要求從左至右的排序時標籤、文字框、按鈕。
模式的結構的描述與使用
1.產品(Product): PanelProduct.java
import javax.swing.*;public class PanelProduct extends JPanel{ JButton button; JLabel label; JTextField textField;}
2.抽象產生器(Builder): Builer.java
import.javax.swing.*;public interface Builder{ public abstract void buildButton(); public abstract void buildLabel(); public abstract void buildTextField(); public abstract JPanel getPanel();}
3.具體產生器(ConcreteBuilder)_1 : ConcreteBuilderOne.java
import javax.swing.*;public class ConcreteBuilderOne implements Builder{ private PanelProduct panel; ConcreteBuilderOne(){ panel=new PanelProduct(); } public void buildButton(){ panel.button=new JButton("按鈕"); } public void buildLabel(){ panel.label=new JLabel("標籤"); } public void buildTextField(){ } public JPanel getPanel(){ panel.add(panel.button); panel.add(panel.label); return panel; }}
3.具體產生器(ConcreteBuilder)_2 : ConcreteBuilderTwo.java
import javax.swing.*;public class ConcreteBuilderTwo implements Builder{ private PanelProduct panel; ConcreteBuilderTwo(){ panel=new PanelProduct(); } public void buildButton(){ panel.button=new JButton("button"); } public void buildLabel(){ } public void buildTextField(){ panel.textField=new JTextField("textField"); } public JPanel getPanel(){ panel.add(panel.textField); panel.add(panel.button); return panel; }}
4.指揮者(Director): Director.java
import javax.swing.*;public class Director{ private Builder builder; Director(Builder builder){ this.builder=builder; } public JPanel constructProduct(){ builder.buildButton(); builder.buildLabel(); builder.buildTextField(); JPanel product=builder.getPanel(); return product; }}
5.應用 Application.java
import javax.swing.*;public class Application{ public static void main(String args[]){ Builder builder=new ConcreteBuilderOne(); Director director=new Director(builder); JPanel panel=director.constructProduct(); JFrame frameOne=new JFrame(); frameOne.add(panel); frameOne.setBounds(12,12,200,120); frameOne.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frameOne.setVisible(true); builder=new ConcreteBuilderTwo(); director=new Director(builder); panel=director.constructProduct(); JFrame frameTwo=new JFrame(); frameTwo.add(panel); frameTwo.setBounds(212,12,200,120); frameTwo.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frameTwo.setVisible(true); }}
【例2】:構建一個男人的類,使得構建和表示分離
類圖如下所示:
Builder
public interface PersonBuilder { void buildHead(); void buildBody(); void buildFoot(); Person buildPerson();}
ConcreteBuilder
public class ManBuilder implements PersonBuilder { Person person; public ManBuilder() { person = new Man(); } @Override public void buildHead() { person.setHead("建造男人的頭"); } @Override public void buildBody() { person.setBody("建造男人的身體"); } @Override public void buildFoot() { person.setFoot("建造男人的腳"); } @Override public Person buildPerson() { return person; }}
Director
public class PersonDirector { public Person constructPerson(PersonBuilder pb) { pb.buildHead(); pb.buildBody(); pb.buildFoot(); return pb.buildPerson(); }}
Product
public class Person { private String head; private String body; private String foot; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; }}public class Man extends Person { }
Test
public class Test { public static void main(String[] args) { PersonDirector pd = new PersonDirector(); Person person = pd.constructPerson(new ManBuilder()); System.out.println(person.getBody()); System.out.println(person.getFoot()); System.out.println(person.getHead()); }}產生器模式的優點
•產生器模式將對象的構造過程封裝在具體產生器中,使用者使用不同的具體產生器就可以得到該對象的不同表示。
•可以更加精細有效地控制對象的構造過程。產生器將對象的構造過程分解成若干步驟,這就使得程式可以更加精細,有效地控制整個對象的構造。
•產生器模式將對象的構造過程與建立該對象類解耦,使得對象的建立更加靈活有彈性。
•當增加新的具體產生器時,不必修改指揮者的代碼,即該模式滿足開-閉原則。
您還可能感興趣:
java設計模式系列:
java設計模式3--單例模式(Singleton)
java設計模式2--抽象原廠模式(Abstract Factory)
java設計模式1--Factory 方法模式(Factory Method)
java設計模式0--設計模式簡介
java設計模式4--建造者模式(Builder)