当前位置: 首页 > article >正文

Build生成器模式

设计模式简述

设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便地复用成功的设计和体系结构

生成器模式(创建型设计模式)

意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

生成器模式适用于:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时

  • 当构造过程必须允许被构造的对象有不同的表示时

具体实例(Java语言)

我们将使用 Builder 模式 编写一个 “文档” 编辑程序。一篇文档应当包含如下结构

● 含有一个标题
● 含有内容(字符串)
● 含有条目项目(列表)

Builder 类中定义了决定文档结构的方法,然后 Director 类使用该方法编写一个具体的文档。

Builder 类是抽象类,它只是声明了抽象方法。它的子类决定了具体编写文档的处理
● MDBuilder 类:使用MD编写文档
● HTMLBuilder 类:使用 HTML 编写文档

1.Builder类

/**
 * 声明编写文档的方法的抽象类
 * 1. makeTitle 编写标题 2. makeString 编写普通文本 3. makeTimes 条目 4. close
 * 完成文档编写的方法
 */
public abstract class Builder {
	public abstract void makeTitle(String title);

	public abstract void makeString(String str);

	public abstract void makeH1(String str);

	public abstract void makeTimes(String[] items);

	public abstract void close();
}

/**
 * 使用 Builder 类中声明的方法来编写文档
 */
class Director {
	private Builder builder;

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

	public void construct() {
		builder.makeTitle("Build Pattern实验");
		builder.makeH1("实验目的");
		builder.makeString("利用Build模式,设计并实现一个能够同时扩展标记语言种类和生成文档种类的文档生成器");
		builder.makeH1("实验内容");
		builder.makeTimes(new String[]{"利用Build模式,设计并实现一个文档生成器。它支持多种标记语言(比如Markdown、Latex,并可以在未来支持其他标记语言),并能生成多种文档,比如html、pdf等。"});
		builder.close();
	}
}

2.MDBuilder

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

/**
 * MD文本编写文档
 */
public class MDBuilder extends Builder {
    private String filename;
    private PrintWriter writer;

    public void makeTitle(String title) {
        filename = "Build pattern 实验.md";
        try {
            writer = new PrintWriter(new FileWriter(filename));
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.println("# " + title);
    }

    public void makeH1(String str) {
        writer.println("## " + str);
    }

    public void makeString(String str) {
        writer.println(str);
    }

    public void makeTimes(String[] items) {
        for (int i = 0; i < items.length; i++) {
            writer.println("* " + items[i]);
        }
    }

    public void close() {
        writer.close();
    }

    public String getResult() {
        return filename;
    }
}

3.HTMLBuilder类

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

/**
 * 使用 HTML 编写文档
 */
public class HTMLBuilder extends Builder {
    private String filename;
    private PrintWriter writer;

    public void makeTitle(String title) {
        filename = "Build pattern 实验.html";
        try {
            writer = new PrintWriter(new FileWriter(filename));
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.println("<html><head><title>" + title
                + "</title></head><body>");
        writer.println("<h1>" + title + "</h1>");
    }

    public void makeH1(String str) {
        writer.println("<h1>" + str + "</h1>");
    }

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

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

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

    public String getResult() {
        return filename;
    }
}

4.Main类

/**
 * 实际编写文档的是 Builder 类
 */
public class Main {
	public static void main(String[] args) {
		// MD文档生成
		MDBuilder textBuilder = new MDBuilder();
		Director director = new Director(textBuilder);
		director.construct();
		String result = textBuilder.getResult();
		System.out.println(result);

		// HTML文档生成
		HTMLBuilder htmlBuilder = new HTMLBuilder();
		Director director1 = new Director(htmlBuilder);
		director1.construct();
		String result1 = htmlBuilder.getResult();
		System.out.println(result1);
	}
}


 


http://www.kler.cn/a/17383.html

相关文章:

  • ML 系列: 第 24 节 — 离散概率分布(泊松分布)
  • Spark 的容错机制:保障数据处理的稳定性与高效性
  • kettle开发-Day43-数据对比
  • 使用HTML、CSS和JavaScript创建动态圣诞树
  • 实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理
  • 后端:Aop 面向切面编程
  • (二)【平衡小车制作】电机驱动(超详解)
  • 内存越界是否一定会导致程序崩溃吗?详解内存越界
  • CUDA下载,以及下载GPU版本的pytorch
  • JAVA基于Springboot框架的停车场管理系统开发实践和实现【附源码】
  • DP动态规划
  • 1.rabbitMQ介绍
  • JavaScript闭包的基本原理和应用场景
  • 人的全面发展评价指标体系—基于相关-主成分分析构建
  • 2000-2019年30省研发资本存量(含计算过程和原始数据)
  • 大数据Doris(八):Broker部署和集群启停脚本
  • 高效学习方法和工具推荐,让你事半功倍!
  • clickhouse里的数组数据类型与相关使用介绍
  • 【C++复习1】程序结构和C++的工作原理
  • Java程序设计入门教程--数组
  • 小球下落(dropping balls)uva679
  • go 打包文件夹成zip文件
  • Envoy控制面实践
  • 漫画 | Linux之父:财务自由以后,我失眠了!
  • 华为OD机试 - 整理扑克牌(Python)
  • [计算机图形学]光场,颜色与感知(前瞻预习/复习回顾)