`
chenchuangfeng
  • 浏览: 80451 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Design Pattern--Builder模式

阅读更多

微博:http://weibo.com/375061590

QQ :375061590

 

         当一个类有多个属性的时候,这时候要去实例化这个类,太多的属性会带来一些不便。

把广东工业大学图书馆的书看成一个实体:

 

package DesignPattern;
 
public class Book {
         /**
          * 书名
          */
         private String bookName;
         /**
          * 可借数量
          */
         private String leandableNum;
         /**
          * 索引号
          */
         private String reference;
         /**
          * 作者
          */
         private String writer;
         /**
          * 出版社
          */
         private String publisher;
         /**
          * 出版年
          */
         private String pubYear;
 
         public Book(String bookName, String leandableNum, String reference,
                            String writer, String publisher, String pubYear) {
                   this.bookName=bookName;
                   this.leandableNum=leandableNum;
                   this.reference=reference;
                   this.writer=leandableNum;
                   this.publisher=publisher;
                   this.pubYear=pubYear;
         }
 
}

实例化Book

Book book = new Book(“深入分析Java Web技术内幕 [专著]”, “0”, “TP312JA/X781”, “许令波”, “电子工业出版社”, “2012”);

 

过多的参数会使使用者混淆,不小心少了一个参数,或者颠倒了位置,会使实例化出错,或者实例出现数据错误,而这种错误编译器是不会报错的。

 

 

 

重叠构造器

重叠构造器解决了一般构造器多参数时候参数混乱的缺点

 

public  Book(String bookName) {
                   this( bookName,"");
         }
         public Book(String bookName, String leandableNum) {
                   this( bookName,leandableNum,"");
         }
         public Book(String bookName, String leandableNum, String reference) {
                   this( bookName,leandableNum,reference,"");
         }
         public Book(String bookName, String leandableNum, String reference,
                            String writer) {
                   this( bookName,leandableNum,reference,writer,"");
         }
         public Book(String bookName, String leandableNum, String reference,
                            String writer, String publisher) {
                   this( bookName,leandableNum,reference,writer,publisher,"");
         }
         public Book(String bookName, String leandableNum, String reference,
                            String writer, String publisher, String pubYear) {
                   this.bookName=bookName;
                   this.leandableNum=leandableNum;
                   this.reference=reference;
                   this.writer=leandableNum;
                   this.publisher=publisher;
                   this.pubYear=pubYear;
         }

 

这类构造通过构造器调用构造器,最后会调用到最后一个构造器,包含了所有参数,但是该方法在更多属性的时候,参数变得太多的话,会产生一大堆构造器,且难控制,代码就太冗长了。

 

 

JavaBeans的setter方法

该方法取代重叠构造器一大堆的构造方法,简化成只需要一个不带参数的构造方法:

 

public  Book() {       }
public void setBookName(String bookName) {
         this.bookName = bookName;
}
public void setLeandableNum(String leandableNum) {
         this.leandableNum = leandableNum;
}
public void setReference(String reference) {
         this.reference = reference;
}
public void setWriter(String writer) {
         this.writer = writer;
}
public void setPublisher(String publisher) {
         this.publisher = publisher;
}
public void setPubYear(String pubYear) {
         this.pubYear = pubYear;
}
public void setBook(Book book) {
         this.book = book;
}
 
Book book = new Book();
book. setBookName(“深入分析Java Web技术内幕 [专著]”);
book .setLeandableNum(“0”);
book .setReference(“TP312JA/X781”);
book . setWriter (“许令波”);
book . setPublisher (“电子工业出版社”);
book . setPubYear (“2012”);

 

       setter方法名称简单易懂,使得代码更加清晰,不会很容易混淆参数。

       但是如果该类是一个不可变类(像String类),setter方法就会破坏其不可变性,使得类是线程不安全的,这时候就要花心思对线程安全进行处理。

 

 

 

Builder模式

可以解决这个问题,既有很强可读性,又能保证不可变类的线程安全

 

package DesignPattern;
 
public class Book {
         /**
          * 书名
          */
         private String bookName;
         /**
          * 可借数量
          */
         private String leandableNum;
         /**
          * 索引号
          */
         private String reference;
         /**
          * 作者
          */
         private String writer;
         /**
          * 出版社
          */
         private String publisher;
         /**
          * 出版年
          */
         private String pubYear;
 
 
         public Book(Builder builder) {
                   this.bookName = builder.bookName;
                   this.leandableNum = builder.leandableNum;
                   this.reference = builder.reference;
                   this.writer = builder.writer;
                   this.publisher = builder.publisher;
                   this.pubYear = builder.pubYear;
         }
 
 
 
         public static class Builder {
                   /**
                    * 书名
                    */
                   protected String bookName;
                   /**
                    * 可借数量
                    */
                   protected String leandableNum;
                   /**
                    * 索引号
                    */
                   protected String reference;
                   /**
                    * 作者
                    */
                   protected String writer;
                   /**
                    * 出版社
                    */
                   protected String publisher;
                   /**
                    * 出版年
                    */
                   private String pubYear;
 
                   public Book build() {
                            return new Book(this);
 
                   }
 
                   public void setBookName(String bookName) {
                            this.bookName = bookName;
                   }
 
                   public void setLeandableNum(String leandableNum) {
                            this.leandableNum = leandableNum;
                   }
 
                   public void setReference(String reference) {
                            this.reference = reference;
                   }
 
                   public void setWriter(String writer) {
                            this.writer = writer;
                   }
 
                   public void setPublisher(String publisher) {
                            this.publisher = publisher;
                   }
 
                   public void setPubYear(String pubYear) {
                            this.pubYear = pubYear;
                   }
 
         }
 
}

 

Book.Builder builder = new Builder();
builder. setBookName(“深入分析Java Web技术内幕 [专著]”);
builder.setLeandableNum(“0”);
builder.setReference(“TP312JA/X781”);
builder. setWriter (“许令波”);
builder. setPublisher (“电子工业出版社”);
builder. setPubYear (“2012”);
Book book = builder.build();

 

 

 

 

 

1
2
分享到:
评论

相关推荐

    design-pattern-java.pdf

    对象的克隆——原型模式(四) 建造者模式-Builder Pattern 复杂对象的组装与创建——建造者模式(一) 复杂对象的组装与创建——建造者模式(二) 复杂对象的组装与创建——建造者模式(三) 七个结构型模式 七个...

    DesignPattern-master.zip

    "DesignPattern-master.zip"这个压缩包很可能包含了一个关于设计模式的项目或教程资源,用于学习和理解各种设计模式。 在这个“DesignPattern-master”目录中,我们可以期待找到不同类型的资源,如源代码示例、解释...

    C++11全套设计模式-23种指针的用法(a full DesignPattern -DesignPattern.zip

    本资料包“DesignPattern - DesignPattern.zip”提供了对C++11中23种设计模式的全面讲解,特别是结合指针使用的部分,以下是对这些知识点的详细阐述: 1. **单例模式(Singleton)**:确保一个类只有一个实例,并...

    designPattern-java.pdf

    《Design Patterns Java Companion》一书由James W. Cooper撰写,于1998年出版,是一本针对Java程序员的经典参考书。本书主要介绍了设计模式的基本概念,并深入探讨了几种关键的设计模式。 #### 创建型模式 创建型...

    23种设计模式的C++实现DesignPattern-master.zip

    本资源"23种设计模式的C++实现DesignPattern-master.zip"包含了以下设计模式的C++实现: 1. **创建型模式**: - **单例模式(Singleton)**:保证一个类只有一个实例,并提供全局访问点。 - **工厂方法模式...

    DESIGN PATTERN - Pro Design Patterns in Swift

    7. **Chapter 18**:可能讲解了建造者模式(Builder),用于复杂对象的构建,它将创建过程与表示分离,使得同一构建过程可以创建不同表示的对象。 8. **Chapter 20**:可能涵盖了命令模式(Command),将请求封装为...

    design-pattern-Java设计模式

    创建型模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),它们关注于如何创建对象。结构型模式包括适配器(Adapter)、桥接(Bridge)、...

    design-pattern

    ##### 3.6 建造者模式 (Builder Pattern) 建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 1. **复杂对象的组装与创建** - **目的**:解决对象创建过程中的各个部分的构建...

    Unity-Design-Pattern-master.zip.zip

    本资料“Unity-Design-Pattern-master.zip”聚焦于将设计模式应用于Unity游戏开发,通过实例解析,帮助开发者提升代码质量和可维护性。 在Unity中,设计模式的应用有助于优化项目结构,提高代码复用,以及更好地...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    4. **建造者模式(Builder Pattern)**:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。在Java中,Builder模式常用于创建复杂的对象结构,如XML解析器。 5. **原型模式(Prototype ...

    DesignPattern-85

    "DesignPattern-85"项目显然关注的是设计模式的学习和应用,特别是与Java编程语言相关的实现。在这个项目中,作者旨在记录自己对设计模式的理解,并分享如何更高效地运用这些模式来优化代码。 首先,我们来讨论设计...

    design-pattern-test:设计模式学习

    工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 2 结构型模式---这些设计模式关注类和...

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    **设计模式**(Design Patterns)是软件工程中的一个重要概念,它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。本章节将从多个角度对设计模式进行深入探讨。 #### 二、设计模式的基本定义 ...

    DesignPattern-Exercises:设计模式练习

    本项目"DesignPattern-Exercises"专注于通过实践来学习和理解设计模式,特别关注Java语言的应用。 在Java中,设计模式主要分为三大类:创建型、结构型和行为型。创建型模式涉及到对象的创建,如单例(Singleton)、...

    DesignPattern-JS

    "DesignPattern-JS"这个项目显然关注的是如何在JavaScript环境中应用设计模式。 首先,我们要理解设计模式的基本概念。设计模式是对在特定上下文中经常出现的软件设计问题的一种解决方案的描述,它不仅包括问题的...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...

    这是一套 Java 设计模式的集合示例-design-pattern.zip

    在"design-pattern.zip"这个压缩包中,我们很可能会找到一系列与Java设计模式相关的代码示例和文档。"design-pattern-master"可能是项目主目录的名字,暗示着这是一个完整的源码仓库。 设计模式分为三大类:创建型...

    design-patterns-builder:生成器设计模式

    在提供的`design-patterns-builder-master`压缩包中,可能包含了以下内容: 1. **Builder接口**:定义了构建产品对象的一系列方法。 2. **ConcreteBuilder类**:实现了Builder接口,提供了具体的构建步骤。 3. **...

    Design*Pattern*Framework*4.5

    "Design*Pattern*Framework*4.5" 可能指的是一个基于 .NET Framework 4.5 的设计模式实现或教程集合。 设计模式是经验丰富的软件开发者的智慧结晶,它们被分为三类:创建型、结构型和行为型。创建型模式涉及对象的...

    设计模式java源码-design-pattern:java设计模式源代码

    1. 创建型模式:这类模式涉及到对象的创建,如单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。这些模式提供了创建对象...

Global site tag (gtag.js) - Google Analytics