`
chenchuangfeng
  • 浏览: 79285 次
  • 性别: 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 复杂对象的组装与创建——建造者模式(一) 复杂对象的组装与创建——建造者模式(二) 复杂对象的组装与创建——建造者模式(三) 七个结构型模式 七个...

    36种最新设计模式整理

    Design Pattern: Builder 模式 Design Pattern: Factory Method 模式 Design Pattern: Prototype 模式 Design Pattern: Singleton 模式 Design Pattern: Registry of Singleton 模式 Design Pattern: Default ...

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

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

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

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

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

    设计模式生成器 生成器设计模式

    CoreJava-DesignPattern

    CoreJava-DesignPattern 创意设计模式 -- Abstract Factory - Done -- Builder - Done -- Factory Method -- Object Pool -- Prototype - Done -- Singleton - Done 结构设计模式 -- Adapter -- Bridge -- ...

    C#设计模式-吕震宇

    C#设计模式(8)-Builder Pattern C#设计模式(7)-Singleton Pattern C#设计模式(6)-Abstract Factory Pattern C#设计模式(5)-Factory Method Pattern C#设计模式(4)-Simple Factory Pattern C#设计模式...

    设计模式 design pattern

    3.2 Builder(生成器)—对象创建型 模式 63 3.3 Factory Method(工厂方法)— 对象创建型模式 70 3.4 Prototype(原型)—对象创建型 模式 87 3.5 Singleton(单件)—对象创建型 模式 84 3.6 创建型模式的讨论 89...

    java设计模式源码-DesignPattern:设计模式(Java实现源码)

    DesignPattern项目是设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发...

    单例模式源码java-DesignPattern:在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在

    Builder-------->建造者模式 Prototype-------->原型模式 1.2 结构型模式 Adapter-------->适配器模式 Bridge-------->桥接模式 Composite-------->组合模式 Decorator-------->装饰模式 Facade--...

    uu-design-pattern:23种设计模式案例

    23种设计模式演示代码文件结构图gof23 |- creational(创建型模式) |- simplefactory 简单工厂模式案例 |- factorymethod 工厂方法模式案例 |- abstractfactory 抽象工厂模式案例 |- builder 建造者模式案例 |- ...

    Java.Design.Patterns.1537192353

    BUILDER PATTERN PROTOTYPE PATTERN ADAPTER PATTERN COMPOSITE PATTERN PROXY PATTERN FAÇADE PATTERN DECORATOR PATTERN FLYWEIGHT PATTERN TEMPLATE METHOD PATTERN MEDIATOR PATTERN CHAIN OF RESPONSIBILITY ....

    Design.Patterns.Explained.Simply

    Builder Factory Method Object Pool Prototype Singleton Structural patterns Adapter Bridge Composite Decorator Facade Flyweight Private Class Data Proxy Behavioral patterns Chain of Responsibility ...

    Design Patterns Elements of Reusable Object-Oriented Software

    • What Is a Design Pattern? • Design Patterns in Smalltalk MVC • Describing Design Patterns • The Catalog of Design Patterns • Organizing the Catalog • How Design Patterns Solve Design ...

    《Java Design Patterns》高清完整英文PDF版

    Learn how to implement design patterns in Java: each pattern in Java Design Patterns is a complete implementation and the output is generated using Eclipse, making the code accessible to all....

    Design Patterns in Modern C++--2018

    Use creational patterns of builder, factories, prototype and singleton Implement structural patterns such as adapter, bridge, decorator, facade and more Work with the behavioral patterns such as ...

    DesignPattern.rar

    涵盖 Adapter Bridge Builder等13种设计模式的C++ 实现

    Design-patterns:java23种设计模式,深入理解灵活运用设计模式对于优化代码质量,提高编程能力非常必要!

    Design-patterns java23种设计模式,深入理解灵活运用设计模式对于优化代码质量,提高编程能力非常必要! Blog 设计模式 module blog 单例模式 Singleton pattern 工厂方法模式 Factory method model 抽象工厂模式 ...

    design patterns elements of reusable object-oriented software

    ★附录A介绍了剩下的设计模式:Bridge(桥接)、Builder(生成器)、Chainof Responsibility(责任链)、Flyweight(蝇量)、Interpreter(解释器)、Mediator(中介者)、Memento(备忘录)、Prototype(原型)、...

Global site tag (gtag.js) - Google Analytics