建造者模式:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
实用范围:1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2 当构造过程必须允许被构造的对象有不同表示时。
角色:
产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
package com.taobao.design; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; /** * 建造模式:创建型 */ public class Builder { public static void main(String[] args) throws IOException { FileBuilder builder = new XmlFileBuilder(); FileDirector director = new FileDirector(builder); MyFile file = director.construct(); file.write("E:\\aaa.xml"); } } /** * 产品:被建造的对象 */ class MyFile { private String head; private String content; private String end; public void setFcontent(String content) { this.content = content; } public void setEnd(String end) { this.end = end; } public void setHead(String head) { this.head = head; } public void write(String path) throws IOException{ File f=new File(path); PrintWriter out=new PrintWriter(new FileWriter(f)); out.println(head); out.println(content); out.println(end); out.close(); } } /** * 建造者:抽象产品的建造过程 */ interface FileBuilder { void buildHead(); void buildContent(); void buildEnd(); MyFile getResult(); } /** * 导演者:用来实施对象的创建过程 */ class FileDirector { private FileBuilder filebuilder; public FileDirector(FileBuilder filebuilder){ this.filebuilder=filebuilder; } public MyFile construct(){ filebuilder.buildHead(); filebuilder.buildContent(); filebuilder.buildEnd(); return filebuilder.getResult(); } } class XmlFileBuilder implements FileBuilder{ private MyFile file = new MyFile(); public void buildHead() { file.setHead("<!--?xml version=\"1.0\"?--><content>"); } public void buildContent() { file.setFcontent("<node>value</node>"); } public void buildEnd() { file.setEnd("</content>"); } public MyFile getResult() { return file; } } class TxtFileBuilder implements FileBuilder{ private MyFile file = new MyFile();; public void buildHead() { file.setHead("this it the txt file head"); } public void buildContent() { file.setFcontent("this it the txt file content"); } public void buildEnd() { file.setEnd("this it the txt file end"); } public MyFile getResult() { return file; } }