iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >学习设计模式之建造者模式,但是宝可梦
  • 490
分享到

学习设计模式之建造者模式,但是宝可梦

设计模式建造者模式 2023-08-30 10:08:48 490人浏览 安东尼
摘要

前言 作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 建造者模式 建造者模式是一种创建型模式,主要针对于某一个类有特别繁杂的属性,并且这些属性中有部分不是必须的。 避免在创建对象时,需要众多的构造函数,就有

前言

作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。

建造者模式

建造者模式是一种创建型模式,主要针对于某一个类有特别繁杂的属性,并且这些属性中有部分不是必须的。
避免在创建对象时,需要众多的构造函数,就有了建造者模式。

比如说,我现在有一个果篮,我可以放苹果、香蕉、梨等各种水果进去构造一个果篮,但是会出现什么状况呢?
我可能今天只有苹果,或者只有香蕉,也有可能我今天只有其中的两种。那么,有3个属性的情况下,会出现共6种情况。
这时候有2种解决办法:1.针对所有情况,写6个不同参数的构造函数;2.写一个全参构造方法,在没有某种水果时传入0或者null。

第一种方法,在属性变多的时候,构造函数直接变成海量;第二种方法,需要记住参数的顺序,容易出错。

(吐槽:要是可以像python一样,把参数名指定一下就好了:比如
plt.plot(data_x, data_y1, label="IUG-CF", marker='*')

那么针对这种“对象的属性过多,又有些属性不必须”的时候,建造者模式是一个好的选择。(就像最近投简历,简历由众多模块组成,可能就没有实习经历,或者项目经历)

1.情景模拟

小智和小霞在旅行,路过西柚市,这里在举办一个多属性大师的比赛,规则是每种属性的宝可梦只能带一只,组成一个队伍参加比赛。
我们把宝可梦组成的队伍抽象成一个类,每种属性的宝可梦作为类的属性。
于是有了Product

public class MultiTypeTeam {    private String fireType; // 火属性    private String waterType; // 水属性    private String flyingType; // 飞行系    private String grassType; // 草属性    private String electricType; // 电属性    // ...    // setter + toString 省略}

小智和小霞找到了比赛的报名入口,这里是一个建造者的抽象建造类:

public interface TeamBuilder {    void chooseFireType();    void chooseWaterType();    void chooseFlyingType();    void chooseGrassType();    void chooseElectricType();}

小智的队伍很快构建出来了:

public class SatoshiTeamBuilder implements TeamBuilder{    private MultiTypeTeam multiTypeTeam;    public SatoshiTeamBuilder() {        this.multiTypeTeam = new MultiTypeTeam();    }    @Override    public void chooseFireType() {        multiTypeTeam.setFireType("喷火龙");    }    @Override    public void chooseWaterType() {        multiTypeTeam.setWaterType("杰尼龟");    }    @Override    public void chooseFlyingType() {        multiTypeTeam.setFlyingType("巴大蝴");    }    @Override    public void chooseGrassType() {        multiTypeTeam.setGrassType("妙蛙种子");    }    @Override    public void chooseElectricType() {        multiTypeTeam.setElectricType("皮卡丘");    }    @Override    public MultiTypeTeam createTeam() {        return this.multiTypeTeam;    }}

小霞直接无语了,谁懂啊家人们,我一个水属性大师,当然只有水属性

public class MistyTeamBuilder implements TeamBuilder{    private MultiTypeTeam multiTypeTeam;    public MistyTeamBuilder() {        this.multiTypeTeam = new MultiTypeTeam();    }    @Override    public void chooseFireType() {            }    @Override    public void chooseWaterType() {        multiTypeTeam.setWaterType("宝石海星");    }    // ......    @Override    public MultiTypeTeam createTeam() {        return this.multiTypeTeam;    }}

再定义一个指挥者,实现使用者和对象创建过程的解耦:

public class Director {    public MultiTypeTeam buildTeam(TeamBuilder teamBuilder){        teamBuilder.chooseElectricType();        teamBuilder.chooseFireType();        teamBuilder.chooseFlyingType();        teamBuilder.chooseWaterType();        teamBuilder.chooseGrassType();        return teamBuilder.createTeam();    }}

测试类:

public class BuilderDemo {    public static void main(String[] args) {        Director director = new Director();        MultiTypeTeam satoshiTeam = director.buildTeam(new SatoshiTeamBuilder());        MultiTypeTeam mistyTeam = director.buildTeam(new MistyTeamBuilder());        System.out.println(satoshiTeam.toString());        System.out.println(mistyTeam.toString());    }}
MultiTypeTeam{fireType='喷火龙', waterType='杰尼龟', flyingType='巴大蝴', grassType='妙蛙种子', electricType='皮卡丘'}MultiTypeTeam{fireType='null', waterType='宝石海星', flyingType='null', grassType='null', electricType='null'}

稍微总结一下,建造者模式的四个角色:

  • 产品 (Product): 要建造的类
  • 抽象建造者 (Builder): 提供建造需要的方法
  • 具体建造者 (Concrete Builder): 实现建造
  • 指挥者 (Director): 调度建造方法,实现解耦,每次使用对象时只需通过Director,不需要知道怎么构建的

上面的实现方法,其实可以让使用者自己来进行按需构建,从而省略指挥者的角色。
并且,修改其中某个参数的时候,需要写一个全新的实现类,这很麻烦。
于是,通过查阅资料,有一种对传统建造者方法的改进,也称为简化版。

2. 改进实现

顺便在这里做一个改进,我们将水属性宝可梦设置为必须的,以区分必须的属性和非必须的属性,然后将建造的方法的返回类型改为建造者

public interface TeamBuilderSimple {    TeamBuilderSimple chooseFireType(String pokemon);    TeamBuilderSimple chooseGrassType(String pokemon);    TeamBuilderSimple chooseFlyingType(String pokemon);    TeamBuilderSimple chooseElectricType(String pokemon);    MultiTypeTeam getTeam();}

那么具体的构造类只需要实现方法:

public class ConcreteTeamBuilderSimple implements TeamBuilderSimple{    MultiTypeTeam multiTypeTeam;    ConcreteTeamBuilderSimple(String waterPokemon){        multiTypeTeam = new MultiTypeTeam();        multiTypeTeam.setWaterType(waterPokemon);    }    @Override    public TeamBuilderSimple chooseFireType(String pokemon) {        multiTypeTeam.setFireType(pokemon);        return this;    }    @Override    public TeamBuilderSimple chooseGrassType(String pokemon) {        multiTypeTeam.setGrassType(pokemon);        return this;    }    @Override    public TeamBuilderSimple chooseFlyingType(String pokemon) {        multiTypeTeam.setFlyingType(pokemon);        return this;    }    @Override    public TeamBuilderSimple chooseElectricType(String pokemon) {        multiTypeTeam.setElectricType(pokemon);        return this;    }    @Override    public MultiTypeTeam getTeam() {        return multiTypeTeam;    }}

于是要使用的时候,就更加方便,通过一种链式调用自行构建对象,且不需要写繁杂的构造函数

public class BuilderDemo02 {    public static void main(String[] args) {        MultiTypeTeam satoshiTeam = new ConcreteTeamBuilderSimple("小锯鳄")                .chooseElectricType("皮卡丘")                .chooseFireType("暖暖猪")                .chooseFlyingType("急冻鸟")                .chooseGrassType("菊草叶")                .getTeam();        MultiTypeTeam mistyTeam = new ConcreteTeamBuilderSimple("暴鲤龙")                .getTeam();        System.out.println(satoshiTeam.toString());        System.out.println(mistyTeam.toString());    }}
MultiTypeTeam{fireType='暖暖猪', waterType='小锯鳄', flyingType='急冻鸟', grassType='菊草叶', electricType='皮卡丘'}MultiTypeTeam{fireType='null', waterType='暴鲤龙', flyingType='null', grassType='null', electricType='null'}

3.应用

3.1 swagger

写过WEB应用的读者们应该接触过Swagger, 通过SpringBoot整合Swagger的时候,会编写一个配置类,我们来看看他的代码:

@Configurationpublic class SwaggerConfig {    @Bean    public Openapi springShopOpenAPI() {        return new OpenAPI()                .info(new Info().title("GoCooking")                        .description("GoCooking API文档")                        .version("v1")                        .license(new License().name("Apache 2.0").url("Http://springdoc.org")))                        .externalDocs(new ExternalDocumentation()                        .description("外部文档")                        .url("https://springshop.wiki.GitHub.org/docs"));    }}

OpenAPI类中有个info属性, 通过info()方法来设置info

public OpenAPI info(Info info) {        this.info = info;        return this;    }

Info类的构建过程,就是本文改进版的写法,比如下面两个方法

    public Info description(String description) {        this.description = description;        return this;    }    public Info title(String title) {        this.title = title;        return this;        }

3.2 StringBuilder

StringBuilder使用append()方法后,返回的还是同一个对象,这也是建造者模式的应用

public StringBuilder append(String str) {        super.append(str);        return this;    }

来源地址:https://blog.csdn.net/weixin_44569973/article/details/132572199

--结束END--

本文标题: 学习设计模式之建造者模式,但是宝可梦

本文链接: https://www.lsjlt.com/news/382667.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 学习设计模式之建造者模式,但是宝可梦
    前言 作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 建造者模式 建造者模式是一种创建型模式,主要针对于某一个类有特别繁杂的属性,并且这些属性中有部分不是必须的。 避免在创建对象时,需要众多的构造函数,就有...
    99+
    2023-08-30
    设计模式 建造者模式
  • 设计模式之建造者模式
    文章目录 盖房项目需求传统方式解决盖房需求传统方式的问题分析建造者模式概述是建造者模式的四个角色建造者模式原理类图建造者模式的注意事项和细节 盖房项目需求 需要建房子:这一过程为打桩、砌墙、封顶房子有各种各样的,比如普通房,高楼...
    99+
    2023-08-30
    设计模式
  • C#设计模式之建造者模式
    场景:我们的冒险家,现在需要去武器商店买一把兵器,有刀和剑两种武器,冒险者可以告诉武器商人需要哪一种武器,然后武器商人进行锻造,最后把产品给冒险者,用建造者模式如何实现? 1.什么是...
    99+
    2024-04-02
  • Java设计模式之建造者模式
    本文由老王家组装电脑引出——建造者设计模式,详细介绍建造者模式的基本概念和实现代码,为了便于理解建造者模式,我们会对实际应用中的典型案例进行介绍。最后对比工厂...
    99+
    2024-04-02
  • java设计模式:建造者模式之生产线
    目录什么是建造者模式建造者模式中的角色产品角色(Product)抽象建造者(Builder)具体建造者角色(ConcreteBuilder)导演者角色(Director)最终测试总结...
    99+
    2024-04-02
  • Java创建型设计模式之建造者模式详解
    目录前言定义结构实现方法应用场景总结建造者模式是Java中一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程分解为多个简单对象的构建过程,并且使这些构建过程按照一定的顺序进行...
    99+
    2023-05-19
    Java建造者模式 Java建造者模式实践 Java创建型设计模式
  • 深入理解Java设计模式之建造者模式
    目录一、什么是建造者模式二、建造者模式的应用场景三、建造者模式的优缺点四、工厂模式和建造者模式的对比五、建造者模式的实现六、总结一、什么是建造者模式 建造者模式也称生成器模式 定义:...
    99+
    2024-04-02
  • Java设计模式之建造者模式实例详解
    本文实例讲述了Java设计模式之建造者模式。分享给大家供大家参考,具体如下:建造者模式(builder)可以将部件和其组装过程分开.一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节.什...
    99+
    2023-05-31
    java 设计模式 建造者模式
  • JAVA设计模式----建造者模式详解
    目录介绍角色代码演示通过反射创建建造者对象优点缺点适用场景总结介绍 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的...
    99+
    2024-04-02
  • Java设计模式的建造者模式是什么
    这篇文章主要介绍了Java设计模式的建造者模式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式的建造者模式是什么文章都会有所收获,下面我们一起来看看吧。1、什么是建造者模式?我们知道在软件开...
    99+
    2023-06-29
  • java设计模式--建造者模式详解
    目录引例一般解法代码:AbstractHouse(房子)Bungalow(平房)Villa (别墅)客户端调用建造者模式建造者模式解法代码:House类(Product产品)Hous...
    99+
    2024-04-02
  • 设计模式系列之如何使用建造者模式
    这篇文章主要讲解了“设计模式系列之如何使用建造者模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“设计模式系列之如何使用建造者模式”吧! 1、概述...
    99+
    2024-04-02
  • Java设计模式之建造者模式的示例详解
    目录定义案例需求方案一方案二对比分析总结建造者模式的优势:注意点 定义 建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽...
    99+
    2024-04-02
  • Java 深入理解创建型设计模式之建造者模式
    1.提出问题 假如说,我们需要建房子:这一过程为打桩、砌墙、封顶。房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的.3)请编写程序,完成需求。 传...
    99+
    2024-04-02
  • .Net创建型设计模式之建造者、生成器模式(Builder)
    目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)四、模式的组成五、建筑者模式的具体实现六、建造者模式的实现要点1、建造者模式的优点:2、建造...
    99+
    2024-04-02
  • Java中常用的设计模式之建造者模式详解
    目录优点缺点使用场景一、实现方式二、实现方式1、引入依赖2、实现三、测试总结优点 1.建造者独立,易扩展。 2.便于控制细节风险。 缺点 1.产品必须有共同点,范围有限制。 2.如内...
    99+
    2024-04-02
  • Java通俗易懂系列设计模式之建造者模式
    目录介绍意图定义实例使用场景JDK中的Builder设计模式示例总结介绍 今天我们将研究java中的Builder模式。Builder 设计模式是一种创造性的设计模式,如工厂模式和抽...
    99+
    2024-04-02
  • Python 设计模式中的创建型建造者模式
    目录一、建造者模式二、代码示例一、建造者模式 建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 => 装修)...
    99+
    2024-04-02
  • java设计模式学习之装饰模式
    装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。缺点:多层装饰比较复杂。实例:给...
    99+
    2023-05-31
    java 设计模式 装饰模式
  • java设计模式学习之代理模式
    代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。代理模式结构图模拟需求:3班小张喜欢1班小红,但是不认识小红,委托1班小明送给小红礼物。创建一个小张和小明都能实现的接口。package ProxyModel;inter...
    99+
    2023-05-31
    java 设计模式 代理模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作