首页 > 其他分享 >复杂对象的创建与组装 - 建造者模式(Builder Pattern)

复杂对象的创建与组装 - 建造者模式(Builder Pattern)

时间:2025-01-06 09:59:35浏览次数:3  
标签:CarBuilder return String builder Pattern Builder 组装 建造 public

建造者模式(Builder Pattern)

建造者模式(Builder Pattern)

建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤构建复杂对象。该模式将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。通过使用建造者模式,你可以避免大量参数化构造函数或多个重载构造函数带来的代码混乱,并且能够更容易地管理复杂的对象创建逻辑。

概念还是有一点抽象的
举个例子,作为一个平时打打游戏的同学,有时候会玩一种赛车游戏。赛车是可以自己定义与组装的。游戏中提供了各种各样的轮子,车体,引擎,悬架。。。 我们可以通过使用这些组件灵活地拼装出我们想要地自定义赛车。那么对这款游戏来说,我们自定义出来地车会有很多种类,那我们怎么实现这个效果呢? 使用建造者模式,具体细节请继续往下阅读。

建造者模式(Builder Pattern)概述

建造者模式结构图

在这里插入图片描述

代码

  1. 产品(Product): 最终被构建出来的复杂对象。它可以是一个具体的类,也可以是包含多个组件的对象。产品对象并不知道如何创建自己;相反,它依赖于建造者来完成其组装。
public class Product {
    private List<String> parts = new ArrayList<>();

    public void add(String part) {
        parts.add(part);
    }

    public void show() {
        System.out.println("Product contains the following parts:");
        for (String part : parts) {
            System.out.println(part);
        }
    }
}
  1. 抽象建造者(Builder):接口或抽象类,声明了用于构建各个组件的方法。具体建造者必须实现这些方法,以提供特定类型的对象构建逻辑。
public interface Builder {
    void buildPartA();
    void buildPartB();
    Product getResult();
}
  1. 具体建造者(ConcreteBuilder):实现了 Builder 接口的具体类。每个具体建造者都对应一种特定的产品类型,并负责一步一步地构建该产品的不同部分。
public class ConcreteBuilder implements Builder {
    private Product product = new Product();

    @Override
    public void buildPartA() {
        product.add("PartA");
    }

    @Override
    public void buildPartB() {
        product.add("PartB");
    }

    @Override
    public Product getResult() {
        return product;
    }
}
  1. 指挥者(Director):指挥者类负责控制和协调建造者的操作顺序。它不直接创建产品实例,而是调用建造者提供的方法来逐步构建产品。这样做的好处是可以改变构建过程中的步骤顺序,而不影响客户端代码。
public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.buildPartA();
        builder.buildPartB();
    }
}

talk is cheap, show you my code

我们还是实现我们开头举的那个例子,实现一个可以自定义组装汽车的建造者模式代码。

class Car {
    private String body;
    private String engine;
    private String wheels;
    private String seats;
 
    // 私有构造函数,防止外部直接实例化
    private Car(CarBuilder builder) {
        this.body = builder.body;
        this.engine = builder.engine;
        this.wheels = builder.wheels;
        this.seats = builder.seats;
    }
 
    // 静态内部类,用于创建CarBuilder实例
    public static class CarBuilder {
        // 汽车部件
        protected String body;
        protected String engine;
        protected String wheels;
        protected String seats;
 
        // 设置车身的方法
        public CarBuilder setBody(String body) {
            this.body = body;
            return this; // 返回当前对象,支持链式调用
        }
 
        // 设置发动机的方法
        public CarBuilder setEngine(String engine) {
            this.engine = engine;
            return this;
        }
 
        // 设置车轮的方法
        public CarBuilder setWheels(String wheels) {
            this.wheels = wheels;
            return this;
        }
 
        // 设置座椅的方法
        public CarBuilder setSeats(String seats) {
            this.seats = seats;
            return this;
        }
 
        // 构建汽车的方法
        public Car build() {
            return new Car(this);
        }
    }
 
    // 展示汽车信息的方法
    @Override
    public String toString() {
        return "Car{" +
                "body='" + body + '\'' +
                ", engine='" + engine + '\'' +
                ", wheels='" + wheels + '\'' +
                ", seats='" + seats + '\'' +
                '}';
    }
}
 
// 具体建造者类:豪华车建造者
class LuxuryCarBuilder extends Car.CarBuilder {
    @Override
    public CarBuilder setBody(String body) {
        super.setBody("Luxury Body");
        return this;
    }
 
    @Override
    public CarBuilder setEngine(String engine) {
        super.setEngine("V8 Engine");
        return this;
    }
 
    @Override
    public CarBuilder setWheels(String wheels) {
        super.setWheels("Alloy Wheels");
        return this;
    }
 
    @Override
    public CarBuilder setSeats(String seats) {
        super.setSeats("Leather Seats");
        return this;
    }
}
 
// 具体建造者类:经济型车建造者
class EconomyCarBuilder extends Car.CarBuilder {
    @Override
    public CarBuilder setBody(String body) {
        super.setBody("Economy Body");
        return this;
    }
 
    @Override
    public CarBuilder setEngine(String engine) {
        super.setEngine("4 Cylinder Engine");
        return this;
    }
 
    @Override
    public CarBuilder setWheels(String wheels) {
        super.setWheels("Steel Wheels");
        return this;
    }
 
    @Override
    public CarBuilder setSeats(String seats) {
        super.setSeats("Fabric Seats");
        return this;
    }
}
 
// 指挥者类:汽车工厂
class CarDirector {
    private Car.CarBuilder builder;
 
    public CarDirector(Car.CarBuilder builder) {
        this.builder = builder;
    }
 
    // 指挥构建汽车的方法
    public Car constructCar() {
        return builder
                .setBody("Default Body") // 可以被具体建造者覆盖
                .setEngine("Default Engine") // 可以被具体建造者覆盖
                .setWheels("Default Wheels") // 可以被具体建造者覆盖
                .setSeats("Default Seats") // 可以被具体建造者覆盖
                .build();
    }
}
 
// 客户端代码
public class Main {
    public static void main(String[] args) {
        // 创建豪华车
        CarDirector luxuryDirector = new CarDirector(new LuxuryCarBuilder());
        Car luxuryCar = luxuryDirector.constructCar();
        System.out.println(luxuryCar);
 
        // 创建经济型车
        CarDirector economyDirector = new CarDirector(new EconomyCarBuilder());
        Car economyCar = economyDirector.constructCar();
        System.out.println(economyCar);
    }
}

在这个例子中,Car类有一个私有构造函数,只能通过CarBuilder内部类来创建实例。CarBuilder是一个抽象建造者,提供了设置汽车各个部件的方法,并返回当前对象以支持链式调用。LuxuryCarBuilder和EconomyCarBuilder是具体建造者,它们覆盖了CarBuilder中的方法以提供不同类型的汽车部件。CarDirector是指挥者,它使用CarBuilder接口来构建汽车,但允许具体建造者提供特定的实现。

客户端代码通过创建CarDirector实例并传递具体的CarBuilder来构建不同类型的汽车。这样,客户端代码与具体的汽车构建过程解耦,只需要知道如何创建指挥者和选择具体的建造者即可。

总结

建造者模式优点:

  • 减少大量的构造函数参数:当一个类有很多可选参数时,可以通过建造者模式来避免长而复杂的构造函数签名。
  • 提高代码可读性:通过链式调用(Fluent Interface),可以使对象创建更加直观和易懂。
  • 易于扩展:如果需要添加新的组件或改变构建逻辑,只需新增具体建造者类,而不需要修改现有代码。
  • 符合单一职责原则:建造者模式让每个类只专注于一件事,即构建某个特定类型的产品。

建造者模式的应用场景

  • 复杂对象创建
  • 多步骤过程
  • 变种对象

建造者模式是一个非常有用的设计模式,特别是在需要处理具有多个可选参数或复杂创建逻辑的对象时。它帮助开发者更好地组织代码,提高系统的灵活性和可维护性。

标签:CarBuilder,return,String,builder,Pattern,Builder,组装,建造,public
From: https://blog.csdn.net/Zongkunxue/article/details/144873149

相关文章

  • 开启家具组装新方式:产品说明书智能指导
    在快节奏的现代生活中,人们越来越追求便捷与高效。无论是新房装修还是家具换新,家具组装已成为许多家庭不可避免的一项任务。然而,面对复杂多变的家具图纸和冗长的产品说明书,许多人常常感到无从下手,甚至因操作不当而损坏零件。为了解决这一难题,一种全新的家具组装方式——产品说明书......
  • 你内部啥样跟我没关系 - 迭代器模式(Iterator Pattern)
    迭代器模式(IteratorPattern)迭代器模式(IteratorPattern)迭代器模式概述迭代器模式结构图迭代器模式涉及的角色talkischeap,showyoumycode总结迭代器模式(IteratorPattern)迭代器模式(IteratorPattern)是一种行为型设计模式,它提供了一种方法顺序访问一个聚合对象......
  • CanvasContext.createPattern
    CanvasContext.createPattern(stringimage,stringrepetition)CanvasContext是旧版的接口,新版Canvas2D接口与Web一致从基础库2.9.0开始,本接口停止维护,请使用RenderingContext代替基础库1.9.90开始支持,低版本需做兼容处理。小程序插件:支持相关文档:旧版画......
  • uniapp(Hbuilderx)
    目录微信开发者工具下载新建项目运行微信开发者工具下载新建项目注意点如果要打包安卓,需要勾上:运行微信小程序1:找到.exe路径,粘贴进去2:打开微信小程序“服务端口”......
  • 数字化浪潮:家具组装行业的产品说明书革命
    数字化转型的大潮中,即便是传统如家具组装行业,也迎来了前所未有的变革机遇。产品说明书,这一看似简单的纸质文档,正逐步向数字化、智能化转型,成为提升组装效率、优化用户体验的关键一环。本文将探讨家具组装行业如何巧妙利用数字化产品说明书,结合智能化辅助工具,推动行业的数字化转型......
  • 架构师-设计模式-享元模式(FlyWeight Pattern)
    享元模式这个名词可能不像其他设计模式一样直接见名知义,可能不像代理模式、单例模式那样一眼看到就知道是干什么的。接下来解释一下享元这个词的含义,享为共享的意思,元就是对象的意思。通俗得来讲享元模式就是共享对象的意思,这种模式一般在系统底层优化使用得比较多,比如前面说过......
  • 从家谱的层级结构 - 组合模式(Composite Pattern)
    组合模式(CompositePattern)组合模式(CompositePattern)组合模式概述组合模式涉及的角色talkischeap,showyoumycode总结组合模式(CompositePattern)组合模式(CompositePattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次关系。组......
  • Java设计模式 —— 【结构型模式】享元模式(Flyweight Pattern) 详解
    文章目录概述结构案例实现优缺点及使用场景概述享元模式也叫蝇量模式:运用共享技术有效地支持大量细粒度的对象;常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们......
  • uniapp - 解决安卓APP运行到真机显示未检测到手机或模拟器,HBuilderX真机调试未检测到
    前言关于此问题网上的教程都无法解决,如果您的情况与我相似,即可解决。在uniappApp项目开发中,解决开发app运行到真机时显示“没有检查到设备”将项目运行到Android手机真机调试却检测不到,实际上已经插上USB数据线了,也开启进入了开发者模式怎么调也识别不到,非常恶心的......
  • 能省一点是一点 - 享元模式(Flyweight Pattern)
    享元模式(FlyweightPattern)享元模式(FlyweightPattern)享元模式(FlyweightPattern)概述享元模式包含的角色:享元模式应用场景talkischeap,showyoumycode总结享元模式(FlyweightPattern)享元模式(FlyweightPattern)是一种结构型设计模式,它主要用于减少创建大量细粒......