设计模式-生成器模式

简介

生成器模式(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
相关推荐
我命由我123453 小时前
CesiumJS 笔记 - 获取容器中心点、Cartesian3 clone 方法、修改 Cartesian3 对象的高度
前端·javascript·css·前端框架·html·html5·js
略略略咯咯3 小时前
(总结)设计模式
设计模式
Hopebearer_4 小时前
页面突然只剩 DOM?一次静态资源版本错配排查
前端·部署
东风破_4 小时前
ESLint 是什么?为什么你的项目需要它?
前端·后端·代码规范
嘻哈∠※4 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7985 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
圣殿骑士-Khtangc6 小时前
Go字符串高效拼接性能对比与底层原理分析
服务器·前端·golang
zander2586 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅6 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
BigTopOne6 小时前
【ijkplayer】 硬解码流程
前端