设计模式-生成器模式

简介

生成器模式(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
相关推荐
Sayuanni%3几秒前
初阶_多线程1(线程含义与关键属性)
java
程序媛徐师姐1 分钟前
Java基于微信小程序的模拟考试系统,附源码+文档说明
java·微信小程序·java模拟考试系统小程序·模拟考试微信小程序·模拟考试系统小程序·模拟考试小程序·java模拟考试小程序
疯狂敲代码的老刘11 分钟前
JDK 1.6到25 全版本网盘合集 (Windows + Mac + Linux)
java·linux·windows·macos·jdk
夕除12 分钟前
js--15
java·jvm·spring
数研小生13 分钟前
亚马逊商品列表API详解
前端·数据库·python·pandas
你听得到1115 分钟前
我彻底搞懂了 SSE,原来流式响应效果还能这么玩的?(附 JS/Dart 双端实战)
前端·面试·github
不倒翁玩偶15 分钟前
npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
前端·npm·node.js
曾经的三心草17 分钟前
redis-9-集群
java·redis·mybatis
奔跑的web.17 分钟前
UniApp 路由导航守
前端·javascript·uni-app