设计模式-生成器模式

简介

生成器模式(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
相关推荐
Re.不晚10 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐16 分钟前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。20 分钟前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野27 分钟前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航29 分钟前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
GIS程序媛—椰子42 分钟前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
DogEgg_0011 小时前
前端八股文(一)HTML 持续更新中。。。
前端·html
Wlq04151 小时前
J2EE平台
java·java-ee
ZL不懂前端1 小时前
Content Security Policy (CSP)
前端·javascript·面试