设计模式(七)之建造者模式

什么是建造者模式

Builder模式又称为建造者模式,是一种创建型设计模式,它常用于组装具有复杂结构的实例。

示例

使用Builder模式编写文档

Builder类

package CreationPattern.BuilderMode;

/**
 * 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 void close();
}

Director

package CreationPattern.BuilderMode;

/**
 * 编写文档类
 */

public class Director {
    
    
    private Builder builder;

    public Director(Builder builder) {
    
    
        this.builder = builder;
    }

    public void construct(){
    
    
        builder.makeTitle("Greeting");
        builder.makeString(" 从早上至下午 ");
        builder.makeItems(new String[]{
    
    "晚上好。","晚安。","再见。"});
        builder.close();
    }
}

HTMLBuilder

package CreationPattern.BuilderMode;

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

/**
 * HTML编写文档
 */

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) {
    
    
            throw new RuntimeException(e);
        }
        writer.println("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><titile>" + title + "</titile></head><body>");
        writer.println("<h1>" + title + "</h1>");
    }

    @Override
    public void makeString(String str) {
    
    
        writer.println("<p>" + str + "</p>");
    }

    @Override
    public void makeItems(String[] items) {
    
    
        writer.println("<ul>");
        for (int i = 0; i < items.length; i++) {
    
    
            writer.println("<li>" + items[i] + "</li>");
        }
        writer.println("</ul>");
    }

    @Override
    public void close() {
    
    
        writer.println("</body></html>");
        writer.close();
    }

    public String getResult() {
    
    
        return filename;
    }
}

TextBuilder

package CreationPattern.BuilderMode;

/**
 * 纯文本编写文档
 */

public class TextBuilder extends Builder {
    
    
    private StringBuffer buffer = new StringBuffer();

    @Override
    public void makeTitle(String title) {
    
    
        buffer.append("==========================\n");
        buffer.append("【" + title + "】\n");
        buffer.append("\n");
    }

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

    @Override
    public void makeItems(String[] items) {
    
    
        for (int i = 0; i < items.length; i++) {
    
    
            buffer.append("   ·" + items[i] + "\n");
        }
        buffer.append("\n");
    }

    @Override
    public void close() {
    
    
        buffer.append("==========================\n");
    }

    public String getResult() {
    
    
        return buffer.toString();
    }
}

Main

package CreationPattern.BuilderMode;

/**
 * Main
 */

public class Main {
    
    
    public static void main(String[] args) {
    
    
        if (args.length != 1) {
    
    
            usage();
            System.exit(0);
        }

        if (args[0].equals("plain")) {
    
    
            TextBuilder textBuilder = new TextBuilder();
            Director director = new Director(textBuilder);
            director.construct();
            String result = textBuilder.getResult();
            System.out.println(result);
        } else if (args[0].equals("html")) {
    
    
            HTMLBuilder htmlBuilder = new HTMLBuilder();
            Director director = new Director(htmlBuilder);
            director.construct();
            String filename = htmlBuilder.getResult();
            System.out.println(filename + "文档编写完成");
        } else {
    
    
            usage();
            System.exit(0);
        }
    }

    public static void usage() {
    
    
        System.out.println("Usage: java Main plain     编写纯文本文档 ");
        System.out.println("Usage: java Main html      编写HTML文档  ");
    }
}

结果
纯文本
在这里插入图片描述
html
在这里插入图片描述
在这里插入图片描述

html使用浏览器打开效果
在这里插入图片描述

总结

在面向对象编程中,“谁知道什么”是非常重要的。也就是说,我们需要在编程时注意哪个类可以使用哪个方法以及使用这个方法到底好不好。

在实际开发中也有许多地方会用到Builder模式,lombok中有一个@Builder注解,他会自动为实体类创建生成器。例:

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * Person类
 */

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    
    
    private Long id;
    private String name;
    private int age;
}
    public static void main(String[] args) {
    
    
        Person p = Person.builder().id(1L).name("zhangsan").age(18).build();
        System.out.println(p);
    }

对于一些比较复杂的实体类生成可以使用该模式,许多框架的底层也大量使用Builder模式

猜你喜欢

转载自blog.csdn.net/weixin_43636205/article/details/129561317