舟山市建設(shè)局網(wǎng)站網(wǎng)站設(shè)計(jì)優(yōu)化
設(shè)計(jì)模式簡(jiǎn)述
設(shè)計(jì)模式的核心在于提供了相關(guān)問(wèn)題的解決方案,使得人們可以更加簡(jiǎn)單方便地復(fù)用成功的設(shè)計(jì)和體系結(jié)構(gòu)。
生成器模式(創(chuàng)建型設(shè)計(jì)模式)
意圖:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
生成器模式適用于:
-
當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)
-
當(dāng)構(gòu)造過(guò)程必須允許被構(gòu)造的對(duì)象有不同的表示時(shí)
具體實(shí)例(Java語(yǔ)言)
我們將使用 Builder 模式 編寫(xiě)一個(gè) “文檔” 編輯程序。一篇文檔應(yīng)當(dāng)包含如下結(jié)構(gòu)
● 含有一個(gè)標(biāo)題
● 含有內(nèi)容(字符串)
● 含有條目項(xiàng)目(列表)
Builder 類(lèi)中定義了決定文檔結(jié)構(gòu)的方法,然后 Director 類(lèi)使用該方法編寫(xiě)一個(gè)具體的文檔。
Builder 類(lèi)是抽象類(lèi),它只是聲明了抽象方法。它的子類(lèi)決定了具體編寫(xiě)文檔的處理
● MDBuilder 類(lèi):使用MD編寫(xiě)文檔
● HTMLBuilder 類(lèi):使用 HTML 編寫(xiě)文檔
1.Builder類(lèi)
/*** 聲明編寫(xiě)文檔的方法的抽象類(lèi)* 1. makeTitle 編寫(xiě)標(biāo)題 2. makeString 編寫(xiě)普通文本 3. makeTimes 條目 4. close* 完成文檔編寫(xiě)的方法*/
public abstract class Builder {public abstract void makeTitle(String title);public abstract void makeString(String str);public abstract void makeH1(String str);public abstract void makeTimes(String[] items);public abstract void close();
}/*** 使用 Builder 類(lèi)中聲明的方法來(lái)編寫(xiě)文檔*/
class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}public void construct() {builder.makeTitle("Build Pattern實(shí)驗(yàn)");builder.makeH1("實(shí)驗(yàn)?zāi)康?#34;);builder.makeString("利用Build模式,設(shè)計(jì)并實(shí)現(xiàn)一個(gè)能夠同時(shí)擴(kuò)展標(biāo)記語(yǔ)言種類(lèi)和生成文檔種類(lèi)的文檔生成器");builder.makeH1("實(shí)驗(yàn)內(nèi)容");builder.makeTimes(new String[]{"利用Build模式,設(shè)計(jì)并實(shí)現(xiàn)一個(gè)文檔生成器。它支持多種標(biāo)記語(yǔ)言(比如Markdown、Latex,并可以在未來(lái)支持其他標(biāo)記語(yǔ)言),并能生成多種文檔,比如html、pdf等。"});builder.close();}
}
2.MDBuilder
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;/*** MD文本編寫(xiě)文檔*/
public class MDBuilder extends Builder {private String filename;private PrintWriter writer;public void makeTitle(String title) {filename = "Build pattern 實(shí)驗(yàn).md";try {writer = new PrintWriter(new FileWriter(filename));} catch (IOException e) {e.printStackTrace();}writer.println("# " + title);}public void makeH1(String str) {writer.println("## " + str);}public void makeString(String str) {writer.println(str);}public void makeTimes(String[] items) {for (int i = 0; i < items.length; i++) {writer.println("* " + items[i]);}}public void close() {writer.close();}public String getResult() {return filename;}
}
3.HTMLBuilder類(lèi)
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;/*** 使用 HTML 編寫(xiě)文檔*/
public class HTMLBuilder extends Builder {private String filename;private PrintWriter writer;public void makeTitle(String title) {filename = "Build pattern 實(shí)驗(yàn).html";try {writer = new PrintWriter(new FileWriter(filename));} catch (IOException e) {e.printStackTrace();}writer.println("<html><head><title>" + title+ "</title></head><body>");writer.println("<h1>" + title + "</h1>");}public void makeH1(String str) {writer.println("<h1>" + str + "</h1>");}public void makeString(String str) {writer.println("<p>" + str + "</p>");}public void makeTimes(String[] items) {writer.println("<ul>");for (int i = 0; i < items.length; i++) {writer.println("<li>" + items[i] + "</li>");}writer.println("</ul>");}public void close() {writer.println("</body></html>");writer.close();}public String getResult() {return filename;}
}
4.Main類(lèi)
/*** 實(shí)際編寫(xiě)文檔的是 Builder 類(lèi)*/
public class Main {public static void main(String[] args) {// MD文檔生成MDBuilder textBuilder = new MDBuilder();Director director = new Director(textBuilder);director.construct();String result = textBuilder.getResult();System.out.println(result);// HTML文檔生成HTMLBuilder htmlBuilder = new HTMLBuilder();Director director1 = new Director(htmlBuilder);director1.construct();String result1 = htmlBuilder.getResult();System.out.println(result1);}
}
?