java 生成器 设计模式_Java中的生成器设计模式

java 生成器 设计模式

Java 中的 Builder设计模式是一种创建模式,即用于创建对象,类似于 工厂方法设计模式 ,这也是创建设计模式。 在学习任何设计模式之前,我建议先找出特定设计模式要解决的问题。 众所周知, 必要性是发明的母亲。 在没有面临问题的情况下学习设计模式并不是那么有效,相反,如果您已经面临问题,那么它比起易于理解的设计模式并学习如何解决问题就容易得多。 在此Java设计模式教程中,我们将首先看到 Builder设计模式 解决了 哪些问题 ,这将使您对 何时在Java中使用Builder设计模式 有一些见识 , 这也是一个 流行的设计模式访谈问题 ,然后我们将看到Builder设计模式的示例。在Java中使用Builder模式的优缺点。

Builder模式在Java中解决了什么问题

正如我之前所说的, Builder模式是一种创造性的设计模式,这意味着它可以解决与对象创建相关的问题。 Java中的构造函数用于创建对象,并且可以采用创建对象所需的参数。 问题始于可以使用许多参数创建对象时,其中一些参数可能是必需的,而其他参数则是可选的 。 考虑一个用于创建Cake的类,现在您需要一些像鸡蛋,牛奶,面粉这样的项目来创建Cake。 其中许多是强制性的,而某些则是可选的,例如Cherry,fruits等。如果我们要为不同种类的蛋糕重载构造函数 ,则将有许多构造函数,甚至最差的情况是,它们将接受许多参数。

问题:

1)要维护的构造函数太多。

2)容易出错,因为许多字段具有相同的类型,例如糖和黄油都放在杯子中,所以如果您传递2杯黄油,则代替2杯糖,编译器不会抱怨,但是会得到几乎没有糖的黄油蛋糕,成本很高浪费黄油。

您可以通过创建Cake并添加配料来部分解决此问题,但这会带来另一个问题,即在构建过程中使Object处于不一致状态 ,理想情况下,cake在创建之前不可用。 这两个问题都可以通过使用Java中的Builder设计模式来解决。 Builder设计模式不仅可以提高可读性,而且还可以通过显式添加成分并使对象在完全构建后可用的方式来减少出错的机会。

顺便说一下,Java中已有许多设计模式教程,例如Java中的 Decorator模式教程Observer模式 。 如果您还没有阅读过,那么值得一读。

Java中的Builder设计模式示例

我们将使用在Java中使用Builder设计模式创建Cake的相同示例。 在这里,我们在Cake中有一个静态的嵌套生成器类 ,用于创建对象。

Java Builder设计模式准则

1)在该类中创建一个称为Builder的静态嵌套类,该类的对象将由Builder生成。 在此示例中,它是Cake。

2)Builder类将具有与原始类完全相同的字段集。 3)在此示例中,Builder类将公开添加配料的方法,例如sugar()。 每个方法将返回相同的Builder对象。 每个方法调用都会丰富Builder。

4)Builder.build()方法会将所有构建器字段值复制到实际类中并返回Item类的对象。

5)Item类(我们正在为其创建Builder的类)应具有私有构造函数,以通过build()方法创建其对象,并防止外部人员访问其构造函数。

public class BuilderPatternExample {
  
    public static void main(String args[]) {
      
        //Creating object using Builder pattern in java
        Cake whiteCake = new Cake.Builder().sugar(1).butter(0.5).  eggs(2).vanila(2).flour(1.5). bakingpowder(0.75).milk(0.5).build();
      
        //Cake is ready to eat :)
        System.out.println(whiteCake);
    }
}

class Cake {

    private final double sugar;   //cup
    private final double butter;  //cup
    private final int eggs;
    private final int vanila;     //spoon
    private final double flour;   //cup
    private final double bakingpowder; //spoon
    private final double milk;  //cup
    private final int cherry;

    public static class Builder {

        private double sugar;   //cup
        private double butter;  //cup
        private int eggs;
        private int vanila;     //spoon
        private double flour;   //cup
        private double bakingpowder; //spoon
        private double milk;  //cup
        private int cherry;

        //builder methods for setting property
        public Builder sugar(double cup){this.sugar = cup; return this; }
        public Builder butter(double cup){this.butter = cup; return this; }
        public Builder eggs(int number){this.eggs = number; return this; }
        public Builder vanila(int spoon){this.vanila = spoon; return this; }
        public Builder flour(double cup){this.flour = cup; return this; }
        public Builder bakingpowder(double spoon){this.sugar = spoon; return this; }
        public Builder milk(double cup){this.milk = cup; return this; }
        public Builder cherry(int number){this.cherry = number; return this; }
      
      
        //return fully build object
        public Cake build() {
            return new Cake(this);
        }
    }

    //private constructor to enforce object creation through builder
    private Cake(Builder builder) {
        this.sugar = builder.sugar;
        this.butter = builder.butter;
        this.eggs = builder.eggs;
        this.vanila = builder.vanila;
        this.flour = builder.flour;
        this.bakingpowder = builder.bakingpowder;
        this.milk = builder.milk;
        this.cherry = builder.cherry;       
    }

    @Override
    public String toString() {
        return "Cake{" + "sugar=" + sugar + ", butter=" + butter + ", eggs=" + eggs + ", vanila=" + vanila + ", flour=" + flour + ", bakingpowder=" + bakingpowder + ", milk=" + milk + ", cherry=" + cherry + '}';

    } 
  
}

输出:

Cake{sugar=0.75, butter=0.5, eggs=2, vanila=2, flour=1.5, bakingpowder=0.0, milk=0.5, cherry=0}

Java中的生成器设计模式–优点和缺点

充分利用Builder模式也有一些缺点,但是如果您查看下面的内容,优点显然超过了Builder设计模式的缺点。 无论如何,这里都没有使用Java创建对象的Builder设计模式的优缺点。

优点:

1)如果创建对象所需的字段数大于4或5,则更具维护性。


2)不太容易出错,因为由于显式方法调用,用户将知道他们正在传递的内容。
3)更健壮,因为只有完全构造的对象可供客户端使用。

缺点: 1)冗长和代码重复,因为Builder需要从Original或Item类复制所有字段。

何时在Java中使用Builder Design模式? Builder模式是一种创建模式,当构造函数中所需的参数数量通常大于4或最多不超过5时,应使用该模式。不要与Builder和Factory模式混淆。 Builder和Factory模式之间的区别,因为Factory可以用于创建同一接口的不同实现,但是Builder与其Container类绑定在一起,并且仅返回Outer类的对象。

这就是Java中的Builder设计模式 。 我们已经了解了为什么需要构建器模式,解决了什么问题,Java中的构建器设计模式示例以及最终何时使用构建器模式的优缺点。 因此,如果您不使用伸缩构造函数模式,或者选择不使用它,则可以选择Builder模式。
  

参考: Java中的构建器设计模式– JCG合作伙伴 Javin Paul在Javarevisited博客上的示例教程


翻译自: https://www.javacodegeeks.com/2012/07/builder-design-pattern-in-java.html

java 生成器 设计模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值