设计模式之 Builder 模式

 

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);

    }

}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值