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运行结果

小福利

另外由于我们程序员经常需要使用网盘,而某度网盘限速严重,所以我开了一个公众号,提供廉价会员:

有需要的扫码关注吧:
公众号二维码

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