这里简单的写一个文件创建器,来说明Builder模式。
首先,整体介绍一下:
这个文件创建器要求能实现创建txt文件和xml文件的功能。采用Builder设计模式。
第二,如果看了上一篇,对于Builder设计模式有了基本的了解,那么就应该知道,我们要创建一个文件MyFile,文件分为三个部分,一个是开头,一个是内容,
一个是结尾。根据Builder设计模式,文件的三个组成部分要放到Builder接口里面,并且从这个接口得到文件。
MyFile的代码:
package Builder; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class MyFile { private FileHead head; private FileContent content; private FileEnd end; public FileHead getHead() { return head; } public void setHead(FileHead head) { this.head = head; } public FileContent getContent() { return content; } public void setContent(FileContent content) { this.content = content; } public FileEnd getEnd() { return end; } public void setEnd(FileEnd end) { this.end = end; } public void write(String path) throws IOException { File file = new File(path); FileWriter fw = new FileWriter(file); PrintWriter out = new PrintWriter(fw); out.println(head.getValue()); out.println(content.getValue()); out.println(end.getValue()); //下面这个流如果不关闭,文件里就没有内容。找了半天。 out.close(); } }
对于文件的三个部分,分别代码如下: package Builder; public class FileHead { private String value = null; public String getValue() { return value; } public void setValue(String value) { this.value = value; } }package Builder; public class FileContent { private String value = null; public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
package Builder; public class FileEnd { private String value = null; public String getValue() { return value; } public void setValue(String value) { this.value = value; } }然后创建Builder接口,里面声明了创建这三个部分的方法,以及一个得到文件的方法。
package Builder; public interface Builder { void buildHead(); void buildContent(); void buildEnd(); MyFile getResult(); }
然后是具体的Builder实现,分别为生成txt和xml的的具体builderpackage Builder; public class TxtBuilder implements Builder { //这里一定要new出来对象,否则下面使用引用的时候会产生空指针异常。 private FileHead fileHead = new FileHead(); private FileContent fileContent = new FileContent(); private FileEnd fileEnd = new FileEnd(); @Override public void buildHead() { fileHead.setValue("My txt head."); } @Override public void buildContent() { fileContent.setValue("My txt content."); } @Override public void buildEnd() { fileEnd.setValue("My txt end."); } @Override public MyFile getResult() { MyFile mf = new MyFile(); mf.setHead(fileHead); mf.setContent(fileContent); mf.setEnd(fileEnd); return mf; } }
package Builder; public class XMLBuilder implements Builder{ //这里一定要new出来对象,否则下面使用引用的时候会产生空指针异常。 private FileHead fileHead = new FileHead(); private FileContent fileContent = new FileContent(); private FileEnd fileEnd = new FileEnd(); @Override public void buildHead() { fileHead.setValue("<?xml version=\"1.0\" encoding=\"GB2312\"?><content>"); } @Override public void buildContent() { fileContent.setValue("<test>asdasd</test>"); } @Override public void buildEnd() { fileEnd.setValue("</content>"); } @Override public MyFile getResult() { MyFile mf = new MyFile(); mf.setHead(fileHead); mf.setContent(fileContent); mf.setEnd(fileEnd); return mf; } }
然后一个Director类,组装起来 package Builder; public class Director { private Builder fileBuilder; public Director(Builder fileBuilder) { this.fileBuilder = fileBuilder; } public void construct() { fileBuilder.buildHead(); fileBuilder.buildContent(); fileBuilder.buildEnd(); } }package Builder; import java.io.IOException; public class Client { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //创建txt文件 Builder txtBuilder = new TxtBuilder(); Director txtDirector = new Director(txtBuilder); txtDirector.construct(); MyFile mfTxt = txtBuilder.getResult(); mfTxt.write("D:/txt.txt"); //创建xml文件 Builder XMLBuilder = new XMLBuilder(); Director XMLDirector = new Director(XMLBuilder); XMLDirector.construct(); MyFile mfXML = XMLBuilder.getResult(); mfXML.write("D:/txt.xml"); } }测试代码