Builder设计模式在Java
Builder设计模式允许通过步骤创建复杂对象,并强制执行将对象创建为成品。
构建对象应该是相同的构建过程可以创建不同的表示.Director控制对象的构建,只有导演什么类型的对象创建。
例如,我们可以考虑打印书籍。
一本书的打印涉及各种步骤,如印刷内容,前言,介绍,章节和结论。
最后,我们将获得完整的书籍对象。
在相同的过程中,我们可以打印具有不同属性的书籍。
如GoF所描述的:"将复杂对象的构造与其表示分开,使得相同的施工过程可以创造不同的表示"
元素:
- 建造者
- 指定用于创建产品对象的部分的抽象接口。
- ConcretyBuilder.
- 通过实现Builder接口构造和组装产品的部件。
- 定义并跟踪它创建的表示。
- 提供用于检索产品的接口。
- 导演
- 使用Builder接口构造一个对象。
- 产品
- 表示正在构造的复杂对象.ConcreteBuilder构建产品的内部表示,并定义其组装的过程。
- 包括定义组成部分的类,包括将部件组装成最终结果的接口。
何时使用它:
- 对象创建算法应独立于系统。
- 可以在不更改核心代码的情况下添加新的创建算法。
- 施工过程必须允许对其委托的对象的不同表示。
- 需要对创建过程进行运行时控制。
工作流程:
- 客户端创建Director对象,并使用所需的构建器对象配置它。
- 在建造一部分产品的一部分时,导演通知建设者。
- Builder处理来自导演的请求并将零件添加到产品中。
- 客户端从Builder检索产品。
例子:
我们可以考虑对书籍的质量。
一本书的打印涉及各种步骤,如印刷内容,前言,介绍,章节和结论。
最后,我们将获得完整的书籍对象。
在相同的过程的帮助下,我们可以编写具有不同属性的书籍。
Bookwriter将指示书籍在步骤中打印书并返回最终的书籍对象。
与Builder模式的通用UML图进行比较:
- BookBuilder(Builder)
- TechnicalBookBuilder(ConcreteBuilder)
- FictionalBookBuilder(ConcreteBuilder)
- 书信制(导演)
- 书(产品)
上面的Java代码:以下类是我们的产品class.Object将由Builder返回此类。
Book.java(产品):
package org.arpit.javapostsforlearning.designpatterns; public class Book { String introduction; String tableOfContent; String preface; String chapters; String glossary; public void setIntroduction(String introduction) { this.introduction = introduction; } public void setTableOfContent(String tableOfContent) { this.tableOfContent = tableOfContent; } public void setPreface(String preface) { this.preface = preface; } public void setChapters(String chapters) { this.chapters = chapters; } public void setGlossary(String glossary) { this.glossary = glossary; } }
以下接口是我们的Builder interface.Builder接口提供步骤或者进程。
我们有五个步骤 - BuidtableOfContent,BuildPreface,BuildIntroduction,BuildChapters,BuildGloss。
它也有返回簿(产品)对象的方法。
Bookbuilder.java(Builder):
package org.arpit.javapostsforlearning.designpatterns; public interface BookBuilder { public void buildTableOfContent(); public void buildPreface(); public void buildIntroduction(); public void buildChapters(); public void buildGlossary(); public Book getBook(); }
课后是我们的第一次实现构建器接口.We正在具有多个具体构建器类来支持相同的构建过程创建多个表示。
TechnicalBookBuilder.java(ConcreteBuilder):
package org.arpit.javapostsforlearning.designpatterns; public class TechnicalBookBuilder implements BookBuilder{ private Book book; public TechnicalBookBuilder() { book=new Book(); } public void buildTableOfContent() { System.out.println("printing technical table of content"); book.setTableOfContent("technical table of content"); } public void buildPreface() { System.out.println("printing preface"); book.setTableOfContent("preface"); } public void buildIntroduction() { System.out.println("printing technical introduction"); book.setTableOfContent("technical introduction"); } public void buildChapters() { System.out.println("printing technical chapters"); book.setChapters("technical chapters"); } public void buildGlossary() { System.out.println("printing technical glossary"); book.setGlossary("Technical glossary"); } public Book getBook() { return book; } }
以下类是我们的Builder接口的第二个实施。
FictionalBookBuilder.java(ConcreteBuilder):
package org.arpit.javapostsforlearning.designpatterns; public class FictionalBookBuilder implements BookBuilder{ private Book book; public FictionalBookBuilder() { book=new Book(); } public void buildTableOfContent() { System.out.println("printing fictional table of content"); book.setTableOfContent("fictional table of content"); } public void buildPreface(){ System.out.println("printing preface"); book.setTableOfContent("preface"); } public void buildIntroduction() { System.out.println("printing fictional introduction"); book.setTableOfContent("fictional introduction"); } public void buildChapters() { System.out.println("printing fictional chapters"); book.setChapters("fictional chapters"); } public void buildGlossary() { System.out.println("printing fictional glossary"); book.setGlossary("Fictional glossary"); } public Book getBook() { return book; } }
以下程序是我们的导演程序,它将指示书籍返回最终书籍对象BookWriter.java(Director):
package org.arpit.javapostsforlearning.designpatterns; public class BookWriter { BookBuilder bookBuilder; public BookWriter(BookBuilder bookBuilder) { super(); this.bookBuilder = bookBuilder; } public Book getBook() { return this.bookBuilder.getBook(); } public void printBook() { this.bookBuilder.buildTableOfContent(); this.bookBuilder.buildPreface(); this.bookBuilder.buildIntroduction(); this.bookBuilder.buildChapters(); this.bookBuilder.buildGlossary(); } }
builderdesignpatternmain.java:
package org.arpit.javapostsforlearning.designpatterns; public class BuilderDesignPatternMain { public static void main(String[] args) { System.out.println(Printing technical book:"); BookBuilder technialbookBuilder=new TechnicalBookBuilder(); BookWriter technicalBookWriter=new BookWriter(technialbookBuilder); technicalBookWriter.printBook(); Book technicalbook=technicalBookWriter.getBook(); System.out.println("Technical Book Printed:"+technicalbook); System.out.println("**"); System.out.println(Printing fictional book:"); BookBuilder fictionalbookBuilder=new FictionalBookBuilder(); BookWriter fictionalBookWriter=new BookWriter(fictionalbookBuilder); fictionalBookWriter.printBook(); Book fictionalbook=fictionalBookWriter.getBook(); System.out.println("Fictionalbook book printed:"+fictionalbook); } }
对于打印技术书,我们已将BookWriter对象配置了TechnicalBookBuilder.BookWriter指示TechnicalBookBuilder打印书籍并返回最终的书籍对象。
虚构书籍是真的。
在相同的建设过程中,我们打印了两种书。
技术和虚构。
输出:
Printing technical book: printing technical table of content printing preface printing technical introduction printing technical chapters printing technical glossary Technical Book printed:org.arpit.javapostsforlearning.designpatterns.Book@1888759 ** Printing fictional book: printing fictional table of content printing preface printing fictional introduction printing fictional chapters printing fictional glossary Fictionalbook book printed:org.arpit.javapostsforlearning.designpatterns.Book@1f1fba0