23种常用设计模式-建造者(Builder)模式

243次阅读
没有评论

共计 2080 个字符,预计需要花费 6 分钟才能阅读完成。

内容目录

建造者模式

概述

 建造者(Builder)模式用于创建过程稳定,但配置多变的对象。其定义是:将一个复杂的构建与其表示相分离,使得同样的构造过程可以创建不同的表示

类型

 建造者模式属于创建型模式。

介绍

  • 目的:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
  • 主要解决:解决在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但是将它们组合在一起的算法确是相对稳定的。
  • 使用场景:当一个对象的创建其一些基本的部件不变,而组合经常发生变化时。
  • 解决方案:使用链式调用来生成不同的配置。
  • 注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

示例代码

 传统的“建造者-指挥者”模式现在已经不太常用了,现在的建造者模式主要是通过链式调用来生成不同的配置。这里我们以制作一杯珍珠奶茶MilkTea为例,进行说明。

MilkTea类

package builder;

import iterator.Book;

public class MilkTea {
    // 对象的配置参数
    private String type;
    private String size;
    private boolean pearl;
    private boolean ice;

    public String getType(){
        return type;
    }
    public String getSize(){
        return size;
    }
    public boolean getPearl(){
        return pearl;
    }
    public boolean getIce(){
        return ice;
    }

    @Override
    public String toString() {
        return "MilkTea{" +
                "type='" + type + '\'' +
                ", size='" + size + '\'' +
                ", pearl=" + pearl +
                ", ice=" + ice +
                '}';
    }
    // 将构造方法设置为私有,外部就不能通过new构建出该实例
    private MilkTea(){}

    private MilkTea(Builder builder){
        this.type = builder.type;
        this.ice = builder.ice;
        this.pearl = builder.pearl;
        this.size = builder.size;
    }
    // 通过内部类Builder构建
    public static class Builder{

        private final String type;
        private String size = "中杯";
        private boolean pearl = true;
        private boolean ice = false;
        // 对于必要的配置,可以通过Builder构造方法传入
        public Builder(String type){
            this.type = type;
        }
        // 其它可选配置通过链式调用,若不配置,则使用默认配置
        public Builder size(String size){
            this.size = size;
            // 链式调用实现的关键
            return this;
        }
        public Builder pearl(boolean pearl){
            this.pearl = pearl;
            return this;
        }
        public Builder ice(boolean ice){
            this.ice = ice;
            return this;
        }
        // 该方法就会创建一个对象并返回
        public MilkTea build(){
            return new MilkTea(this);
        }
    }
}

 在上述代码中可以看到,我们将 MilkTea 的构造方法设置为私有的,所以外部不能通过 new 构建出 MilkTea 实例,只能通过 Builder 构建。对于必须配置的属性,通过 Builder 的构造方法传入,可选的属性通过 Builder 的链式调用方法传入,如果不配置,将使用默认配置,也就是中杯、加珍珠、不加冰。

 测试代码如下:

package builder;

import org.junit.Test;

public class BuilderTest {
    @Test
    public void builderTest(){
        MilkTea pearl = new MilkTea.Builder("原味")
                .size("中杯")
                .ice(true)
                .pearl(true)
                .build();
        System.out.println(pearl.toString());
    }
}

其它

 这里介绍的Builder模式并非传统经典的Builder模式,而是适用于Java、最常用的Builder模式,该模式是通过内部类实现链式调用进行创建的,在这里,链式调用更为优雅、清晰、一目了然,一行代码就完成了对象创建,避免了多行代码赋值过程出错,同时也省去了大量冗余的变量,避免变量复制出错。

 该模式在很多优秀的Java开源框架出现过,例如okHttp、Spring生态、Retrofit等等。

正文完
 
PG Thinker
版权声明:本站原创文章,由 PG Thinker 2023-10-15发表,共计2080字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
热评文章
Rust中所有权与借用规则概述

Rust中所有权与借用规则概述

在GC与手动管理内存之间,Rust选择了第三种:所有权机制...