Builder 模式,生成器,将一个复杂对象的构建鱼他的表示分离,使得同样的创建过程可以创建不同的表示。Builder与AbsctactFactory模式相似,也是创建复杂对象的,但是AbsctactFactory侧重于多个系列的产品是复杂的。而Builder在是一步一步的构造复杂的对象,在最后返回产品。
以下情况应当使用建造者模式:
1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
效果:
1、可以改变一个产品的内部表示
2、他将构造代码与表示代码分开
3、可以对构造过程进行更加精细的控制。
功能演示
测试程序结构图如下:
UML图中,共有四个类:
Builder 抽象类:不含实际处理内容,仅声明抽象方法。
Director 类:负责产生文件的类
TextBuilder 类:产生一般文件格式文件
HtmlBuilder 类:产生HTML格式文件
package com.ray.builder;
public abstract class Builder
{
// 产生文件的标题
public abstract void makeTitle(String title);
//产生文件中的字符串
public abstract void makeString(String str);
//产生文件中的项目
public abstract void makeItems(String[] items);
//取得完成的文件
public abstract Object getResult();
}
package com.ray.builder;
public class Director
{
private Builder builder;
public Director(Builder builder)
{
this.builder = builder;
}
public Object construct()
{
builder.makeTitle("从早上到晚上");
builder.makeItems(new String[] {"早安", "午安" });
builder.makeString("到了晚上");
builder.makeItems(new String[] {"晚安", "祝你好梦", "再见" });
return builder.getResult();
}
}
package com.ray.builder;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class HTMLBuilder extends Builder
{
private String filename;
private PrintWriter writer;
@Override
public void makeTitle(String title)
{
filename = title + ".html";
try
{
writer = new PrintWriter(new FileWriter(filename));
}
catch (IOException e)
{
// TODO: handle exception
e.printStackTrace();
}
writer.println("<html><head><title>" + title + "</title></head><body>");
writer.println("<h1>" + title + "</h1>");
}
@Override
public Object getResult()
{
// TODO Auto-generated method stub
writer.println("</body></html>");
writer.close();
return filename;
}
@Override
public void makeItems(String[] items)
{
// TODO Auto-generated method stub
writer.println("<ul>");
for (int i = 0; i < items.length; i++)
{
writer.println("<li>" + items[i] + "</li>");
}
writer.println("</ul>");
}
@Override
public void makeString(String str)
{
// TODO Auto-generated method stub
writer.println("<p>" + str + "</p>");
}
}
package com.ray.builder;
public class TextBuilder extends Builder
{
private StringBuffer buffer = new StringBuffer();
public TextBuilder()
{
// TODO Auto-generated constructor stub
}
@Override
public void makeTitle(String title)
{
// TODO Auto-generated method stub
buffer.append("=========");
buffer.append("[" + title + "]");
buffer.append(" ");
}
@Override
public void makeString(String str)
{
// TODO Auto-generated method stub
buffer.append(" " + str + " ");
buffer.append(" ");
}
@Override
public void makeItems(String[] items)
{
// TODO Auto-generated method stub
for (int i = 0; i < items.length; i++)
{
buffer.append("." + items[i] + " ");
}
buffer.append(" ");
}
@Override
public Object getResult()
{
// TODO Auto-generated method stub
buffer.append("================");
return buffer.toString();
}
}
package com.ray.builder;
public class TestBuildPattern
{
/**
* [一句话功能简述]<BR>
* [功能详细描述]
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Director director = new Director(new TextBuilder());
String result = (String) director.construct();
System.out.println(result);
Director director1 = new Director(new HTMLBuilder());
String result1 = (String)director1.construct();
System.out.println(result1);
}
}