java设计模式4--建造者模式(Builder)
本文地址: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();}@Overridepublic void buildHead() {person.setHead("建造男人的頭");}@Overridepublic void buildBody() {person.setBody("建造男人的身體");}@Overridepublic void buildFoot() {person.setFoot("建造男人的腳");}@Overridepublic 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 Method)?
java設計模式0--設計模式簡介
總結
以上是生活随笔為你收集整理的java设计模式4--建造者模式(Builder)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java设计模式3--单例模式(Sing
- 下一篇: java设计模式5--原型模式(Prot