【设计模式-6】建造者模式的实现与框架中的应用

这篇具有很好参考价值的文章主要介绍了【设计模式-6】建造者模式的实现与框架中的应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 建造者模式又被成为生成器模式,是一种使用频率比较低,相对复杂的创建型模式,在很多源码框架中可以看到建造者的使用场景,稍后我们会在本文末尾展示几个框架的使用案例。
 建造者模式所构造的对象通常是比较复杂而且庞大的,也是按照既定的构建顺序将对象中的各个属性组装起来。与工厂模式不同的是,建造者模式主要目的是把繁琐的构建过程从产品类和工厂类中抽离出来,进一步解耦,最终实现用一套标准的制造工序制造出不同的产品。

1. 定义

建造者模式 的官方定义是:将一个复杂对象的构建和表示分离,使得同样的构建过程可以创建不同的表示。建造者模式一步一步地创建一个复杂的对象,它允许用户通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的构造细节。

 官方的表达还是挺难理解的,总体意思就是,构建过程固定,构建使用的每个组件都可以通过继承或者实现 呈现出多态的特性,这依赖于抽象建造者接口和具体的建造者实现类两个组件来表示。

 在建造者模式中,通常包含4个角色:

  • 产品:复杂的产品类,建造者的最终产物,构建过程相对复杂,需要很多组件组装而成。
  • 抽象建造者:建造者接口,包含两个方便,一个是构成产品的各个属性,一个是各个属性的构建步骤方法。
  • 建造者实现:建造者接口的实现类,可以有多个,对应不同的组件实现细节,但是不会包含构建的顺序逻辑。
  • 指导者:客户端依赖的创建产品的指导者类,指导者类会通过建造者接口引入具体的建造者实现,并且包含了具体的构建顺序。

2. 代码实现

 建造者的实现逻辑想对复杂,下面展示一个酒水制造的代码案例,某个酒厂生产啤酒和红酒两类产品,对应上述的四个角色,代码实现如下:

  • 1. 产品
// 产品对象
public class Wine {

    // 用list封装制作工艺,表示制作的顺序是固定的
    private List<String> list = new ArrayList();
    // 1.准备原材料
    public void setPrepareMaterial(String prepareMaterial) {
        list.add(prepareMaterial);
    }
    // 2.制作工艺
    public void setCraftsmanShip(String craftsmanShip) {
        list.add(craftsmanShip);
    }
    // 3.出厂包装
    public void setFactoryPackage(String factoryPackage) {
        list.add(factoryPackage);
    }

    @Override
    public String toString() {
        return "Wine{" + "list=" + list + '}';
    }
}
  • 2. 抽象建造者
// 抽象的建造者
public abstract class AbstractBuilder {
    // 自定义产品
    Wine wine = new Wine();

    // 设置原材料
    public abstract void setPrepareMaterial();
    // 设置制作工艺
    public abstract void setCraftsmanShip();
    // 设置出厂包装
    public abstract void setFactoryPackage();

    // 获取产品 - 注意这里是个钩子方法,子类可以不实现
    public Wine getProduct() {
        return wine;
    }
}
  • 3. 建造者实现
// 啤酒建造者-具体的子类实现
public class BeerBuilder extends AbstractBuilder {

    @Override
    public void setPrepareMaterial() {
        wine.setPrepareMaterial("1.准备原材料:小麦 + 豆子");
    }

    @Override
    public void setCraftsmanShip() {
        wine.setCraftsmanShip("2.制作工艺:发酵 + 蒸馏");
    }

    @Override
    public void setFactoryPackage() {
        wine.setFactoryPackage("3.出厂包装:易拉罐 + 纸箱");
    }
}

// 葡萄酒制造者 - 具体的子类实现
public class GrapeBuilder extends AbstractBuilder{

    @Override
    public void setPrepareMaterial() {
        wine.setPrepareMaterial("1.准备原材料:葡萄 + 酵母");
    }

    @Override
    public void setCraftsmanShip() {
        wine.setCraftsmanShip("2.制作工艺:发酵 + 地下贮存");
    }

    @Override
    public void setFactoryPackage() {
        wine.setFactoryPackage("3.出厂包装:玻璃瓶 + 木箱");
    }
}
  • 4. 指导者
// 指挥者 - 构造产品对象
public class Director {

    private AbstractBuilder abstractBuilder;

    public Director(AbstractBuilder abstractBuilder) {
        this.abstractBuilder = abstractBuilder;
    }

    // 这里固定制造的工序,按照固定步骤执行
    public Wine createProduct() {
        // 第一步:设置原材料
        abstractBuilder.setPrepareMaterial();
        // 第二步:设置制作工艺
        abstractBuilder.setCraftsmanShip();
        // 第三步:设置出厂包装
        abstractBuilder.setFactoryPackage();
        // 第四步,返回产品
        return abstractBuilder.getProduct();
    }
}
  • 客户端
// 客户端
public class Client {
    public static void main(String[] args) {
        // 啤酒制造
        Director beerDirector = new Director(new BeerBuilder());
        Wine beer = beerDirector.createProduct();
        System.out.println(beer);
        
        // 红酒制造
        Director grapeDirector = new Director(new GrapeBuilder());
        Wine grape = grapeDirector.createProduct();
        System.out.println(grape);
    }
}

3. UML类图

 对照上述的代码Demo,我们来把这个案例的类图画出来,对应如下:
【设计模式-6】建造者模式的实现与框架中的应用,设计模式,设计模式,建造者模式,windows

4. 简化

 因为建造者是属于相对复杂的一种模式,在实际的应用当中有很多种简化的写法,比如可以忽略指导者类、建造者接口等等。下面是一种实现方式,这种实现方式在很多源码中可以看到具体实现。

 通常在产品类的构造函数参数超过4个,而且这些参数中有一些是必填项,考虑使用这种建造者模式。现在我们来构建一个电脑的产品对象。

// 电脑产品对象
public class Computer {
    private String cpu; // 必选
    private String ram; // 必选
    private String keyboard; // 可选
    private String mouse; // 可选
    private String display; // 可选
}

 这种bean类的属性设置有两种方式,一个是构造函数入参,一个是通过set()方法入参,这两种方式都有些问题。构造函数入参,当参数较多的时候,类型相同的情况下,属性的顺序容易混乱;第二个中set()方式,一个对象会支持在很多模块中设置,因为类中的属性是可以分布设置的,所以容易出现属性状态变化造成错误。

 下面是一种简易的建造者实现方式(在实际场景中可能属性的构建过程很复杂):

  • 建造者模式
// 电脑产品对象
public class Computer {
    private final String cpu; // 必选
    private final String ram; // 必选
    private final String keyboard; // 可选
    private final String mouse; // 可选
    private final String display; // 可选

    private Computer(Computer.Builder builder) {
        this.cpu = builder.cpu;
        this.ram = builder.ram;
        this.keyboard = builder.keyboard;
        this.mouse = builder.mouse;
        this.display = builder.display;
    }

    public static Computer.Builder builder(String cpu, String ram) {
        return new Computer.Builder(cpu, ram);
    }

    public static class Builder {
        private String cpu; // 必选
        private String ram; // 必选
        private String keyboard; // 可选
        private String mouse; // 可选
        private String display; // 可选

        Builder(String cpu, String ram) {
            this.cpu = cpu;
            this.ram = ram;
        }

        public Builder cpu(String cpu) {
            this.cpu = cpu;
            return this;
        }

        public Builder ram(String ram) {
            this.ram = ram;
            return this;
        }

        public Builder keyboard(String keyboard) {
            this.keyboard = keyboard;
            return this;
        }

        public Builder mouse(String mouse) {
            this.mouse = mouse;
            return this;
        }

        public Builder display(String display) {
            this.display = display;
            return this;
        }

        public Computer build() {
            return new Computer(this);
        }
    }

    @Override
    public String toString() {
        return "Computer{" + "cpu='" + cpu + '\'' + ", ram='" + ram + '\'' + ", keyboard='" + keyboard + '\''
            + ", mouse='" + mouse + '\'' + ", display='" + display + '\'' + '}';
    }
}
  • 客户端实现
// 客户端
public class Client {
    public static void main(String[] args) {
        Computer computer = Computer.builder("cpu", "ram")
            .cpu("cpu-1").mouse("mouse").display("display").build();
        System.out.println(computer);
    }
}

5. 总结

 建造者模式的核心在于如何一步一步地构建一个包含多个组成部件的完整对象,使用相同的构建过程可以构建不同的产品。在软件开发中,如果需要创建复杂对象,并且系统系统具备良好的灵活性和扩展性,可以考虑使用建造者模式。文章来源地址https://www.toymoban.com/news/detail-783281.html

  • 首先建造者模式使得客户端和产品创建的过程解耦,客户端可以不知道产品创建的内部细节;
  • 构建过程固定的情况下,构建的细节可以多变性,这就可以很方便的增加不同的构造实现,符合开闭原则;
  • 将每个属性的构建过程分解在不同的方法中,精细化管理,高内聚才能低耦合,符合单一职责。

6. 框架中的应用

  • StringBuilder和StringBuffer
  • SqlSessionBuilder
  • Lombok的@Builder注解

到了这里,关于【设计模式-6】建造者模式的实现与框架中的应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式: 建造者模式

    建造模式通过一步一步的去构建一个复杂的对象。该模式将对象的构建细节封装在一个独立的建造者类中,使得客户端代码可以根据需要定制对象的构建过程,而不必知道具体的构建细节。 建造者模式通常包括以下几个角色: 产品类(Product):需要对象,通常是包含多个属

    2024年02月21日
    浏览(29)
  • 设计模式-建造者模式

    在前面几篇文章中,已经讲解了单例模式、工厂方法模式、抽象工厂模式,创建型还剩下一个比较重要的模式-建造者模式。在理解该模式之前,我还是希望重申设计模式的初衷,即 为解决一些问题而提供的优良方案 。学习设计模式遗忘其初衷,注定无法理解其真正的深刻内

    2024年02月15日
    浏览(31)
  • 【设计模式】建造者模式

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 意图: 将一个复杂的构建与其表示相分

    2024年02月13日
    浏览(32)
  • 设计模式——建造者模式

    建造者模式(Builder Pattern)是一种创建型设计模式,它允许通过分步骤来构建复杂对象。该模式的核心原理是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表现形式。 在建造者模式中,通常有以下角色: 抽象建造者(Builder): 定义了创建产品

    2024年01月16日
    浏览(32)
  • 设计模式之建造者模式

    建造者模式(Builder Pattern) 是一种创建型设计模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种模式适用于需要分步骤创建复杂对象、构造过程可能需要改变、或者需要隐藏复杂对象的具体构建过程的场景。 Product(产品) :表

    2024年04月24日
    浏览(23)
  • 设计模式(三)建造者模式

    相关文章 设计模式系列 1.建造者模式简介 定义 建造者模式(builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 简介 建造者模式(builder)是创建一个复杂对象的创建型模式,将构建复杂对象的过程和它的部件解耦,使得构建过程和

    2024年03月17日
    浏览(39)
  • 设计模式(9)建造者模式

    一、介绍 1、概念:将一个复杂对象的构造与它的表示分离,使得同样的构造过程可以创建不同的表示。建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化;建造者模式的好处就是使得建造代码与表

    2024年02月11日
    浏览(29)
  • Java设计模式-建造者模式

    建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通过将复杂对象的构建过程分解为多个简单的步骤来实现。 与其他创建型模式不同,建造者模式强调的是将构建过程与表示分离,而不是将对

    2024年02月02日
    浏览(29)
  • 【创建型设计模式】C#设计模式之建造者模式

    参考代码:

    2024年02月13日
    浏览(32)
  • 【设计模式】建造者模式就是游戏模式吗?

    传说女娲是用泥巴捏出人来的,当时捏出的小泥人虽然每个都是两条腿、两只手、一个脑袋的样子,但是具体到每个部位,却有有所不同:有的小泥人手长一点,有的手短一点;有的脑袋圆鼓鼓的,有的脑袋尖尖的······ 造物者归纳起来其实就一句话: 女娲造人,形态各

    2024年01月21日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包