小兔网

一、前言

今天我们讨论一下 Builder 建造者模式,这个 Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在 Builder 模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这些方法的有机组合,这个类的职责就是监工,规定了到底要怎么样有机的组合这些方法。在监工类(Director)中,将父类组合进去,然后调用父类的操作来抽象的实现一件事情,这就是面向接口(抽象)变成的妙处了,当然这个 Builder 可以使接口也可以是抽象类,在这里我们使用抽象类。

2021071306380513384950

二、Builder 模式代码

Builder 抽象类:

Builder.java

public abstract class Builder { public abstract void makeString(String str); public abstract void makeTitle(String title); public abstract void makeItems(String[] items); public abstract void close(); }

HtmlBuilder 实现类:

HtmlBuilder.java

import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter; public class HtmlBuilder extends Builder { private String filename; private PrintWriter pw; public void makeTitle(String title) { filename="D:\\"+title+".html"; try { pw=new PrintWriter(new FileWriter(filename)); } catch (IOException e) { e.printStackTrace(); } pw.println("<html><head><title>"+title+"</title></head><body>"); pw.println("<h1>"+title+"</h1>"); } public void makeString(String str) { pw.println("<p>"+str+"</p>"); } public void makeItems(String[] items) { pw.println("<ul>"); for(int i=0;i<items.length;i++){ pw.println("<li>"+items[i]+"</li>"); } pw.println("</ul>"); } public void close() { pw.println("</body></html>"); pw.close(); } public String getResult(){ return filename; }}

TextBuilder 实现类:

TextBuilder.java

public class TextBuilder extends Builder { StringBuffer sb=new StringBuffer(); public void makeTitle(String title) { sb.append("====================="); sb.append("["+title+"]"+"\n"); } public void makeString(String str) { sb.append("@"+str+"\n"); } public void makeItems(String[] items) { for(int i=0;i<items.length;i++){ sb.append(" ."+items[i]+"\n"); } } public void close() { sb.append("====================="); } public String getResult(){ return sb.toString(); } }