设计模式-生成器模式

简介

生成器模式(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
相关推荐
智想天开几秒前
31.设计模式的反模式与常见误区
设计模式
自由鬼10 分钟前
正向代理服务器Squid:功能、架构、部署与应用深度解析
java·运维·服务器·程序人生·安全·架构·代理
袁煦丞31 分钟前
【局域网秒传神器】LocalSend:cpolar内网穿透实验室第418个成功挑战
前端·程序员·远程工作
江城开朗的豌豆32 分钟前
Vuex数据突然消失?六招教你轻松找回来!
前端·javascript·vue.js
好奇心笔记42 分钟前
ai写代码随机拉大的,所以我准备给AI出一个设计规范
前端·javascript
江城开朗的豌豆42 分钟前
Vue状态管理进阶:数据到底是怎么"跑"的?
前端·javascript·vue.js
用户214118326360243 分钟前
dify案例分享-Dify v1.6.0 重磅升级:双向 MCP 协议引爆 AI 生态互联革命
前端
程序员海军44 分钟前
AI领域又新增协议: AG-UI
前端·openai·agent
我想说一句1 小时前
React待办事项开发记:Hook魔法与组件间的悄悄话
前端·javascript·前端框架
真夜1 小时前
CommonJS与ESM
前端·javascript