Builder设计模式在Java

时间:2020-02-23 14:34:44  来源:igfitidea点击:

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