zoukankan      html  css  js  c++  java
  • 设计模式之Builder模式

      在平时的项目开发中,我们会通过构造方法传参来实例化对象。

      但在需要多个参数时,如果继续使用构造方法实例,编写代码会非常麻烦,而且在其他项目成员传参时特别容易出现传参错误的情况,这时我们不妨来使用Builder模式进行编写。

      在使用Builder模式之前,我们先看下重叠构造器模式和JavaBeans模式:

    1、 重叠构造器模式

     1 package com.effectiveJava;
     2 
     3 public class MultiContrucProduct {
     4     private String name;
     5     private float price;
     6     private float weight;
     7     private String introduction;
     8     private String category;
     9     
    10     public MultiContrucProduct(String name,float price){
    11         this(name,price,(float)0);
    12     }
    13     
    14     public MultiContrucProduct(String name,float price, float weight){
    15         this(name, price,weight,null);
    16     }
    17     
    18     public MultiContrucProduct(String name,float price,float weight,String introduction){
    19         this(name,price,weight,introduction,null);
    20     }
    21     
    22     public MultiContrucProduct(String name,float price,float weight,String introduction,String category){
    23         this.name = name;
    24         this.price = price;
    25         this.weight = weight;
    26         this.introduction = introduction;
    27         this.category = category;
    28     }
    29 
    30     public String getName() {
    31         return name;
    32     }
    33 
    34     public void setName(String name) {
    35         this.name = name;
    36     }
    37 
    38     public float getPrice() {
    39         return price;
    40     }
    41 
    42     public void setPrice(float price) {
    43         this.price = price;
    44     }
    45 
    46     public float getWeight() {
    47         return weight;
    48     }
    49 
    50     public void setWeight(float weight) {
    51         this.weight = weight;
    52     }
    53 
    54     public String getIntroduction() {
    55         return introduction;
    56     }
    57 
    58     public void setIntroduction(String introduction) {
    59         this.introduction = introduction;
    60     }
    61 
    62     public String getCategory() {
    63         return category;
    64     }
    65 
    66     public void setCategory(String category) {
    67         this.category = category;
    68     }
    69     
    70     
    71 }
    View Code

    实例化对象:

     1 MultiContrucProduct multiContrucProduct = 2 new MultiContrucProduct("multiProduct", 10, 10, null, "cloth"); 

    使用重叠构造器模式在参数较多时,比较繁杂,冗余代码多,而且在传参时容易出现参数类型,参数顺序不对,造成错误。

    2、JavaBeans模式

     1 package com.effectiveJava;
     2 
     3 public class JavaBeanProduct {
     4     private String name;
     5     private float price;
     6     private float weight;
     7     private String introduction;
     8     private String category;
     9     
    10     public JavaBeanProduct(){
    11         
    12     }
    13 
    14     public String getName() {
    15         return name;
    16     }
    17 
    18     public void setName(String name) {
    19         this.name = name;
    20     }
    21 
    22     public float getPrice() {
    23         return price;
    24     }
    25 
    26     public void setPrice(float price) {
    27         this.price = price;
    28     }
    29 
    30     public float getWeight() {
    31         return weight;
    32     }
    33 
    34     public void setWeight(float weight) {
    35         this.weight = weight;
    36     }
    37 
    38     public String getIntroduction() {
    39         return introduction;
    40     }
    41 
    42     public void setIntroduction(String introduction) {
    43         this.introduction = introduction;
    44     }
    45 
    46     public String getCategory() {
    47         return category;
    48     }
    49 
    50     public void setCategory(String category) {
    51         this.category = category;
    52     }
    53     
    54     
    55 }
    View Code

    实例化对象:

    1 JavaBeanProduct javaBeanProduct = new JavaBeanProduct();
    2         javaBeanProduct.setName("javaBeanProduct");
    3         javaBeanProduct.setPrice(10);
    4         javaBeanProduct.setWeight(10);
    5         javaBeanProduct.setIntroduction(null);
    6         javaBeanProduct.setCategory("cloth");

    使用JavaBeans模式编写较为简单,通过set方式也比较容易区分参数。但在构造过程中JavaBean可能处于不一致的状态,这时使用该实例将会导致失败。此外JavaBeans模式阻止了把类构造为不可变对象的

    可能性,影响多线程中安全性处理。

    3、Builder模式

     1 package com.effectiveJava;
     2 
     3 public class BuilderProduct {
     4     private String name;
     5     private float price;
     6     private float weight;
     7     private String introduction;
     8     private String category;
     9     
    10     private BuilderProduct(Builder builder){
    11         this.name = builder.name;
    12         this.price = builder.price;
    13         this.weight = builder.weight;
    14         this.introduction = builder.introduction;
    15         this.category = builder.category;
    16     }
    17     
    18     public static class Builder{
    19         private final String name;
    20         private final float price;
    21         private float weight;
    22         private String introduction;
    23         private String category;
    24 
    25         public float getWeight() {
    26             return weight;
    27         }
    28 
    29 
    30 
    31         public Builder setWeight(float weight) {
    32             this.weight = weight;
    33             return this;
    34         }
    35 
    36 
    37 
    38         public String getIntroduction() {
    39             return introduction;
    40         }
    41 
    42 
    43 
    44         public Builder setIntroduction(String introduction) {
    45             this.introduction = introduction;
    46             return this;
    47         }
    48 
    49 
    50 
    51         public String getCategory() {
    52             return category;
    53         }
    54 
    55 
    56 
    57         public Builder setCategory(String category) {
    58             this.category = category;
    59             return this;
    60         }
    61 
    62 
    63 
    64         public BuilderProduct builder(){
    65             return new BuilderProduct(this);
    66         }
    67         
    68         public Builder(String name,float price){
    69             this.name = name;
    70             this.price = price;
    71         }
    72     }
    73 }
    View Code

    实例化对象:

    1         BuilderProduct builderProduct =  new BuilderProduct.Builder("builderProduct",0)
    2                 .setCategory("cloth")
    3                 .setIntroduction(null)
    4                 .setWeight(10)
    5                 .builder();

    Builder模式是综合了以上两种模式的优点,即保证了重叠构造器模式的安全性,也能兼顾JavaBeans模式的可读性。当然Builder模式还有其他的使用方式,本文只是展示了其中的一种使用。

     
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利
  • 相关阅读:
    quagga源码学习--BGP协议的初始化
    Golang pprof heap profile is empty
    python requests 配置超时及重试次数
    SVN: bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7
    OpenSSL Command-Line HOWTO
    树莓派保卫战--防止SSH暴力破解
    Mac OS X Tips
    Git Tips
    SQL分组多列统计(GROUP BY后按条件分列统计)
    Show Linux Package Sort By Size
  • 原文地址:https://www.cnblogs.com/zkjwp7/p/6884939.html
Copyright © 2011-2022 走看看