设计模式-生成器模式

简介

生成器模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象。它允许客户端通过指定不同类型的生成器来创建不同类型的对象,同时隐藏了对象的具体创建过程。

在不同的文献和讨论中,你可能会看到"构建者模式"和"生成器模式"这两个术语交替使用,但它们都指的是一种用于构建复杂对象的模式,这种模式允许客户端通过指定不同的生成器来创建不同类型的对象,同时隐藏了对象的具体创建过程。因此,可以认为构建者模式和生成器模式是同一个模式的不同叫法,它们在概念上是相同的。

生成器模式最早由Gamma、Helm、Johnson和Vlissides在1995年的《设计模式:可复用面向对象软件的基础》一书中提出。这本书是设计模式领域的经典之作,总结了22种常见的设计模式,其中包括生成器模式。

解决问题

生成器模式主要解决以下问题:

  • 1.复杂对象的创建:当创建一个复杂对象时,可能会涉及到多个步骤和多个参数,使用生成器模式可以将这些步骤和参数封装在一个生成器类中,使得对象的创建过程更加简洁和清晰。

  • 2.可扩展性:生成器模式允许通过添加新的生成器类来创建不同类型的对象,而无需修改现有的代码。这提高了代码的可扩展性和可维护性。

  • 3.隐藏创建过程:生成器模式将对象的创建过程封装在生成器类中,客户端只需指定生成器的类型,无需了解具体的创建过程。这降低了客户端与具体实现之间的耦合度。

示例代码

以下是一个简单的生成器模式示例,以构建一个复杂对象,以汽车为例。

首先,定义一个汽车接口 和实现类:

java 复制代码
public interface ICar {
    void setWheel(String wheel);
    void setEngine(String engine);
    void setBody(String body);
    void display();
}
java 复制代码
public class Car implements  ICar{
    private String wheel;
    private String engine;
    private String body;
    @Override
    public void setWheel(String wheel) {
        this.wheel = wheel;
    }
    @Override
    public void setEngine(String engine) {
        this.engine = engine;
    }
    @Override
    public void setBody(String body) {
        this.body = body;
    }
    @Override
    public void display() {
        System.out.println("Wheel: " + wheel);
        System.out.println("Engine: " + engine);
        System.out.println("Body: " + body);
    }

接下来,定义一个生成器接口和实现类:

java 复制代码
public interface ICarBuilder {
    ICarBuilder buildWheel(String wheel);
    ICarBuilder buildEngine(String engine);
    ICarBuilder buildBody(String body);
    ICar build();
}
java 复制代码
public class CarBuilder implements ICarBuilder{
    private ICar icar;
 
    public CarBuilder(){
        icar = new Car();
    }
    @Override
    public ICarBuilder buildWheel(String wheel) {
        icar.setWheel(wheel);
        return this;
    }
 
    @Override
    public ICarBuilder buildEngine(String engine) {
        icar.setEngine(engine);
        return this;
    }
 
    @Override
    public ICarBuilder buildBody(String body) {
        icar.setBody(body);
        return this;
    }
 
    @Override
    public ICar build() {
        return icar;
    }
}

客户端代码:

java 复制代码
public class Client {
    public static void main(String[] args) {
        ICarBuilder builder = new CarBuilder();
        ICar car = builder
                .buildBody("big body")
                .buildWheel("round wheel")
                .buildEngine("strong engine")
                .build();
        car.display();
        System.out.println("------------------------");
        ICar car2 = builder
                .buildBody("small body")
                .buildWheel("round wheel")
                .buildEngine("weak engine")
                .build();
        car2.display();
    }
}

输出结果:

复制代码
     Wheel: round wheel
     Engine: strong engine
     Body: big body
     ------------------------
     Wheel: round wheel
     Engine: weak engine
     Body: small body
相关推荐
定栓5 分钟前
Webpack迁到Vite第一节:模块系统迁移:require → import
运维·前端·webpack
金銀銅鐵8 分钟前
[Java] 用 GUI 展示 ArrayList 扩容的过程
java·后端·ai编程
磊 子11 分钟前
什么是虚假唤醒(spurious wakeup)?从 POSIX 标准讲到 futex 内核
java·开发语言
小熊在忙fpga14 分钟前
N32G430芯片的flash表示
前端·javascript·html
Data analyse45620 分钟前
App埋点版本兼容的字段迁移校验
大数据·运维·服务器·前端·数据库·数据分析
飘然生22 分钟前
traceId链路 skywalking java agent
java·开发语言·skywalking
todoitbo26 分钟前
本来只想给内网开个口子,Natapp 却多给了一道防护
前端·javascript·vue.js·内网穿透·网络防护·natapp
IT研究室28 分钟前
最新计算机毕业设计选题推荐-基于spring boot的母婴全程服务管理系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
会灭火的程序员32 分钟前
SuperMap AgentX Server智能体接入WEB应用技术文档
前端·supermap·agentx·agentx server
CRMEB36 分钟前
商品 SKU 设计,从简单规格到多规格踩过什么
java·前端·数据库·开源