Java-設計模式-第七篇-建造者模式


本人所學設計模式皆出自於 結城浩先生的《圖解設計模式》。

類圖

builder模式類圖

爲什麼使用創造者/builder模式

在面向對象編程中,“誰知道什麼”是非常重要的。也就是說,我們需要在編程時注意哪個類可以使用哪個方法以及使用這個方法到底好不好。
在builder中,Director不知道自己究竟使用的是Builder的哪個子類,這是因爲“只有不知道才能替換!”。只有這樣組件才具有高價值,作爲設計人員,我們必須時刻關注這種“可替換性”。

示例代碼

整體結構

 整體結構

代碼

抽象類

package com.imiros.build.freamwork.base;

/**
 * 建造者模式抽象基類
 *
 * @author zxq
 * @date 2019/6/10 10:21
 */
public abstract class AbstractBuilder {
    /**
     * 編寫標題
     */
    public abstract void makeTitle(String title);

    /**
     * 編寫字符串
     */
    public abstract void makeString(String str);

    /**
     * 編寫條目
     */
    public abstract void makeItems(String[] items);

    /**
     * 輸出文檔
     */
    public abstract void close();
}

Direcor類

package com.imiros.build.freamwork;

import com.imiros.build.freamwork.base.AbstractBuilder;

/**
 * 文章類
 *
 * @author zxq
 * @date 2019/6/10 10:30
 */
public class Director {
    /**
     * 含有一個構造者,這個構造者由實現者指定
     */
    private AbstractBuilder builder;

    /**
     * 通過構造器指定要調用的建造類
     *
     * @param builder
     */
    public Director(AbstractBuilder builder) {
        this.builder = builder;
    }

    /**
     * 文本類根據現有數據直接輸出文檔
     *
     * @param title 標題
     * @param str   字符串
     * @param items 條目
     */
    public void createDirector(String title, String str, String[] items) {
        builder.makeTitle(title);
        builder.makeString(str);
        builder.makeItems(items);
        builder.close();
    }
}

具體的構造類

HtmlBuilder

package com.imiros.build.freamwork;

import com.imiros.build.freamwork.base.AbstractBuilder;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 網頁構建
 *
 * @author zxq
 * @date 2019/6/10 10:26
 */
public class HtmlBuilder extends AbstractBuilder {
    /**
     * html文件名
     */
    private String fileName;
    /**
     * 打印流
     */
    private PrintWriter printWriter;

    @Override
    public void makeTitle(String title) {
        fileName = title + ".html";
        try {
            printWriter = new PrintWriter(new FileWriter(fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        printWriter.println("<html><head><title>" + title + "</title></head><body>");
        printWriter.println("<h1>" + title + "</h1>");
    }

    @Override
    public void makeString(String str) {
        printWriter.println("<p><a href='" + str + "'>" + str + "</a></p>");
    }

    @Override
    public void makeItems(String[] items) {
        printWriter.println("<ul>");
        for (String item : items) {
            printWriter.println("<li>" + item + "</li>");
        }
        printWriter.println("</ul>");
    }

    @Override
    public void close() {
        printWriter.println("</body></html>");
        printWriter.close();
        System.out.println(fileName);
    }
}

TextBuilder

package com.imiros.build.freamwork;

import com.imiros.build.freamwork.base.AbstractBuilder;

/**
 * 文本構建
 *
 * @author zxq
 * @date 2019/6/10 10:26
 */
public class TextBuilder extends AbstractBuilder {

    private StringBuilder sb = new StringBuilder();

    @Override
    public void makeTitle(String title) {
        sb.append("------------------開始------------------");
        sb.append("\n" + title);
    }

    @Override
    public void makeString(String str) {
        sb.append("\n" + str);
    }

    @Override
    public void makeItems(String[] items) {
        for (String item : items) {
            sb.append("\n" + "    ~" + item);
        }
    }

    @Override
    public void close() {
        sb.append("\n");
        sb.append("------------------結束------------------");
        System.out.println(sb);
    }
}

測試類及結果

測試類

package com.imiros.build;

import com.imiros.build.freamwork.Director;
import com.imiros.build.freamwork.HtmlBuilder;
import com.imiros.build.freamwork.TextBuilder;

/**
 * 測試類
 *
 * @author zxq
 * @date 2019/6/10 10:17
 */
public class Test {
    public static void main(String[] args) {
        String title = "這是一個標題";
        String str = "http://www.imiros.com";
        String[] items = {"百度網盤廉價會員!", "愛奇藝會員!", "騰訊視頻會員!", "樣樣都有,開掃描下面二維碼吧!"};
        //html
        Director director = new Director(new HtmlBuilder());
        director.createDirector(title, str, items);
        //text
        director = new Director(new TextBuilder());
        director.createDirector(title, str, items);
    }
}

運行結果

text結果

這是一個標題.html
------------------開始------------------
這是一個標題
http://www.imiros.com
    ~百度網盤廉價會員!
    ~愛奇藝會員!
    ~騰訊視頻會員!
    ~樣樣都有,開掃描下面二維碼吧!
------------------結束------------------

html結果

html運行結果

小福利

另外由於我們程序員經常需要使用網盤,而某度網盤限速嚴重,所以我開了一個公衆號,提供廉價會員:

有需要的掃碼關注吧:
公衆號二維碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章