標籤:
建造者模式簡介
建造者模式是將一個複雜的對象的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。換句話說,建造模式是對象的建立模式。建造模式可以將一個產品的內部表象與產品的生產過程分割開來,從而可以使一個建造過程產生具有不同的內部表象的產品對象。
建造者模式的設計方法
建造者模式通常有四個結構主體,它們分別是Director,Builder,ConcreteBuilder,Product。每個主體所起的作用不一樣,下面分別說說它們的作用。
Director的作用
構造一個使用Builder抽象介面的對象,即使用一個Builder對象來構造一個Director對象。
Builder的作用
為建立一個Product對象的各個組件指定抽象介面,即定義一些公用部分。
ConcreteBuilder的作用
實現Builder的公用介面以構造產品的各個零組件;
定義並明確它所建立的表示;
提供一個擷取產品的介面,例如get方法;
Product的作用
表示被構造的複雜物件,包含定義組件的類,並將這些組件裝配成最終的產品。
建造者模式的範例程式碼 樣本介紹
下面將通過一個訊息推送功能來掩飾建造者模式的應用,先在有兩種訊息,一種是上線提醒,另外一種是離線提醒。訊息的內容是時間:**** 某人已經上線(或下線)!首先,我們建立訊息類,由於訊息體大致相同,因此我們先定義一個公用的抽象訊息,然後讓兩種具體的訊息繼承這個抽象類別,可以實現部分代碼共用。
抽象訊息
package com.builder;/** * 通知抽象類別 */import java.util.Date;public abstract class AbstractNotification {private String subject;private Date date;protected String content;public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public String getContent() {return content;}public void send() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("時間:");stringBuilder.append(this.getDate());stringBuilder.append("\t");stringBuilder.append(this.getSubject());stringBuilder.append(this.getContent());System.out.println(stringBuilder.toString());}} 上線提醒訊息
package com.builder;public class OnlineNotification extends AbstractNotification {public OnlineNotification() {this.content="已經上線";}}
下線提醒訊息
package com.builder;public class OfflineNotification extends AbstractNotification {public OfflineNotification() {this.content="已經下線";}}
然後我們建立一個Builder介面,裡面定義建立姓名、日期的公用方法,並且定義一個擷取通知的方法。
Builder介面
package com.builder;import java.util.Date;public interface Builder {public abstract void buildSubject(String subject);public abstract void buildDate(Date date);public abstract AbstractNotification getNotification(); }
接著我們建立兩個具體的Builder對象,實現Builder介面。
兩個ConcreteBuilder類
package com.builder;import java.util.Date;public class OnlineNotificationBuilder implements Builder {private AbstractNotification abstractNotification;public OnlineNotificationBuilder() {abstractNotification=new OnlineNotification();}@Overridepublic void buildSubject(String subject) {abstractNotification.setSubject(subject);}@Overridepublic void buildDate(Date date) {abstractNotification.setDate(date);}@Overridepublic AbstractNotification getNotification() {return abstractNotification;}}
package com.builder;import java.util.Date;public class OfflineNotificationBuilder implements Builder {private AbstractNotification abstractNotification;public OfflineNotificationBuilder() {abstractNotification=new OfflineNotification();}@Overridepublic void buildSubject(String subject) {abstractNotification.setSubject(subject);}@Overridepublic void buildDate(Date date) {abstractNotification.setDate(date);}@Overridepublic AbstractNotification getNotification() {return abstractNotification;}}
Director類
package com.builder;import java.util.Date;public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void construct(String subject,Date date) {builder.buildSubject(subject);builder.buildDate(date);AbstractNotification notification = builder.getNotification();notification.send();}}
測試代碼
package com.builder;import java.util.Date;public class Test {public static void main(String[] args) {Builder onlineNotificationBuilder = new OnlineNotificationBuilder();Director director = new Director(onlineNotificationBuilder);director.construct("張三", new Date());}}
測試結果
時間:Thu Aug 13 16:07:58 CST 2015張三已經上線
Java設計模式之建造者模式