设计模式篇---建造者模式

news2024/11/17 1:42:04

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示。
这么看起来有点难以理解,翻译一下就是 用户无需关注创建复杂对象的过程,只需要指定创建的对象即可。比如用户要一辆车,他不需要关注创建车的细节,只需要指定要什么牌子的车即可,创建车的过程就是对象的构建,用户要的车就是对象的表示,这两个是分离开的。

结构

建造者模式主要由以下4部分组成
抽象建造者(Builder):它是一个接口或者抽象类。是具体建造者的父类,主要作用是创建复杂对象的各个组件和返回创建的好的对象。
具体建造者(ConcreteBuilder):它是抽象建造者的实现,实现了对象每个组件的创建并返回明确的对象。
产品(Product):它是复杂的对象,包含多个组件,具体建造者创建该产品的内部并定义它的装配过程。
指挥者(Director):指挥者主要用来安排创建负责对象的建造顺序。客户端只需要和指挥者进行交互,客户端制定好创建者的类型(并不是产品的类型),然后由指挥者返回创建好的对象。

在这里插入图片描述

实例

有一家游戏公司,在游戏中玩家可以创建不同的角色,比如骑士、公主、恶魔等,每个角色都有一些属性,例如力量、技能、面容等。这些复杂的角色创建过程都是类似的,对于这些角色的创建,我们可以使用建造者模式。

游戏角色类。

@Data
public class Actor {
    
    private String type; //角色类型
    private String sex; //性别
    private String face; //脸型
    private String costume; //服装
    private String hairstyle; //发型
}

游戏建造者类,充当抽象建造者。

public abstract class ActorBuilder {
    
    protected Actor actor = new Actor();
    
    public abstract void buildType();
    
    public abstract void buildSex();
    
    public abstract void buildFace();
    
    public abstract void buildCostume();
    
    public abstract void buildHairstyle();
    
    //工厂方法,返回一个完整的游戏角色对象
    public Actor createActor() {
        return actor;
    }
    
}

英雄建造者,具体的建造者。

public class HeroBuilder  extends  ActorBuilder{

    @Override
    public void buildType() {
        actor.setType("英雄");
    }

    @Override
    public void buildSex() {
        actor.setSex("男");
    }

    @Override
    public void buildFace() {
        actor.setFace("英俊");
    }

    @Override
    public void buildCostume() {
        actor.setCostume("盔甲");
    }

    @Override
    public void buildHairstyle() {
        actor.setHairstyle("飘逸");
    }
}

天使建造者,充当具体的建造者

public class AngelBuilder extends ActorBuilder{
    
    @Override
    public void buildType() {
        actor.setType("天使");
    }

    @Override
    public void buildSex() {
        actor.setSex("女");
    }

    @Override
    public void buildFace() {
        actor.setFace("漂亮");
    }

    @Override
    public void buildCostume() {
        actor.setCostume("白裙");
    }

    @Override
    public void buildHairstyle() {
        actor.setHairstyle("披肩长发");
    }
}

角色控制器,充当指挥者。

public class ActorDirector {
    
    public Actor construct(ActorBuilder actorBuilder) {
        actorBuilder.buildType();
        actorBuilder.buildSex();
        actorBuilder.buildFace();
        actorBuilder.buildCostume();
        actorBuilder.buildHairstyle();
        return actorBuilder.createActor();
    }
    
}

客户端测试

public class Client {

    public static void main(String[] args) {

        ActorDirector actorDirector = new ActorDirector();
        
        Actor hero = actorDirector.construct(new HeroBuilder());
        System.out.println(hero);

        Actor angle = actorDirector.construct(new AngelBuilder());
        System.out.println(angle);

    }

}

打印结果
在这里插入图片描述

总结

建造者模式的优点:
1、客户端不需要关注具体创建的细节,只需要指定创建者即可。
2、相同的创建可以创建不同的产品对象。
3、每个建造者不相互影响,符合开闭原则,便于扩展。
4、可以控制创建对象的顺序。

建造者模式的缺点:
1、当各个产品之间的差异很大时,不适合使用建造者模式,因此其使用范围受到了一定的限制。
2、当具体建造者过多时,如果父类扩展新的抽象方法,则维护起来比较困难。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文带你了解云HIS

一、简介 基于云计算技术的B/S架构的HIS系统,为基层医院机构提供标准化的、信息化的、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准管理信息系统的功能。系统利用健康云计算平台的技术优势,建立统一的健康档案存储平台&am…

spark调试中常见的错误集锦

示例一、没有引入jar错误 错误描述: 以spark在pyspark环境解析xml为例 spark核心包不支持解析xml,所以需要引入引用依赖包配置为: config("spark.jars.packages", "com.databricks:spark-xml_2.12:0.16.0") 在spark-submit部署提交…

ctfshow_反序化漏洞

web254 首先进行一个代码审计 <?php error_reporting(0); highlight_file(__FILE__); include(flag.php);class ctfShowUser{public $usernamexxxxxx;public $passwordxxxxxx;public $isVipfalse;public function checkVip(){return $this->isVip;}public function logi…

Converting Phase Noise to Random Jitter(Period)

推导了Phase Noise to Random Jitter(Period)的转换过程&#xff0c;解释了分频对Phase Noise & Spur(每2分频改善6dB)的影响&#xff0c;每N分频&#xff0c;TIE RJ(1&#x1d70e;)不变(之前已推导)&#xff0c;而Period RJ(1&#x1d70e;)增加√N倍。

RecyclerView 实现WheelView和省市区多级联动

作者&#xff1a;丨小夕 前言 滚轮经常在选择中用到&#xff0c;主要包括类型选择、省市区联动选择、年月日联动选择等。 项目中的WheelView一般都是ScrollViewLinearLayout组合完成的。 但是自定义起来比较复杂&#xff0c;也有一些优秀的第三方库DateSelecter 通过Adapter…

直线导轨的技术应用

直线导轨是机械领域中使用广泛的一种构件&#xff0c;主要用于机器的移动和定位。它具有高精度、高刚性和耐磨损等优点&#xff0c;被广泛应用于工业制造、医疗设备、半导体设备等领域。现在&#xff0c;我们来详细了解一下直线导轨的技术应用。 1、移动装置&#xff0c;直线导…

二、Spring Cloud Eureka 简介、快速入门

注册发现中心 Eureka 来源于古希腊词汇&#xff0c;意为“发现了”。在软件领域&#xff0c; Eureka 是 Netflix 在线影片公司开源的一个服务注册与发现的组件&#xff0c;和其他 Netflix 公司的服务组件&#xff08;例如负载均衡、熔断器、网关等&#xff09; 一起&#xff0…

基于灰狼优化算法的最小二乘支持向量机及其MATLAB实现

常用的预测方法有回归分析法、神经网络法、支持向量机(SVM, Support Vector Machine)等。回归分析法是建立影响因素与目标量之间的回归方程&#xff0c;建模过程简单&#xff0c;但预测精度较低。神经网络法适合分析大量非线性数据样本&#xff0c;挖掘其潜在规律&#xff0c;具…

流量玩家必看,微信问一问轻松获取200+引流秘籍

最近&#xff0c;微信推出了全新的“问一问”功能&#xff0c;为流量玩家带来了巨大的流量红利。这一新的流量入口势必成为流量玩家们追逐的热门目标。 “问一问”可以被视为一个问答型平台&#xff0c;可以简单理解为“微信版的知乎”。熟悉在知乎上进行问答引流的人都知道&am…

VVIC搜款网API接口:获取商品详情数据API

VVIC电商平台汇集了数千家优质品牌和供应商&#xff0c;包括服装、家居用品、电子产品、美妆产品、食品和饮料等各种商品。消费者可以在VVIC上找到各类品牌和产品&#xff0c;满足他们的购物需求。VVIC还提供了多种付款方式和物流配送服务&#xff0c;确保消费者的购物过程顺利…

BI-SQL丨WITH NOLOCK

WITH(NOLOCK) 企业在搭建数仓的时候&#xff0c;对于数仓的负载性能和运行速度都是纳入考量标准的。特别是并发性较高的情况下&#xff0c;如何规避因用户使用量较多而导致死锁卡死的问题呢&#xff1f;其实&#xff0c;这些可以通过WITH(NOLOCK)来解决。 WITH(NOLOCK)顾名思…

Mysql进阶(三)之索引篇

文章目录 前言索引介绍1.什么是索引&#xff1f;2.优缺点3.什么时候需要 / 不需要索引&#xff1f;4.语法 索引底层结构1.Hash表2.BTree 索引分类1.按字段特性2.按物理存储3.按字段个数 索引优化1.SQL性能分析2.索引失效3.常见索引优化方法 前言 以面试题驱动索引的学习&#…

go-zero的配置及gorm、自定义返回等的引入以及扩展

工程维度&#xff08;摘自官网&#xff09; . ├── consumer ├── go.mod ├── internal │ └── model ├── job ├── pkg ├── restful ├── script └── service consumer&#xff1a; 队列消费服务internal&#xff1a; 工程内部可访问的公共模块job&a…

MMYOLO框架标注、训练、测试全流程(补充篇)

前言 MMYOLO框架是一个基于PyTorch和MMDetection的YOLO系列算法开源工具箱。MMYOLO定位为YOLO系列热门开源库以及工业应用核心库&#xff0c;MMYOLO框架Github项目地址支持的任务&#xff1a;目标检测、旋转目标检测支持的算法&#xff1a;YOLOv5、YOLOX、RTMDet、RTMDet-Rota…

使用 okhttp3库发送 get、post(json参数传递,form表单提交) java代码实现

OkHttp是一个开源的HTTP客户端&#xff0c;由Square公司开发。OkHttp3是OkHttp库的最新版本。它提供了一个简单而强大的API来处理网络通信。以下是OkHttp3库的一些主要特点&#xff1a; 与Android平台完全兼容&#xff1a;OkHttp3可以与标准的Java库一起使用&#xff0c;也可以…

【前端】导航栏html(ul+li)/css/js(jq)

引入jq <script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> css代码 <style>ul {list-style: none;margin: 0;padding: 0;}li {cursor: pointer;}.color-white {color: #FFFFFF !important;background-color: rgb…

git 报错 fatal: Authentication failed的解决

git提交代码的时候&#xff0c;报错 remote: Support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for informa…

三个好基友Cookie、Session和Token

原创声明&#xff0c;转载请注明文章链接来源、作者信息 >三个好基友Cookie、Session和Token hello&#xff0c;我是索奇~ 精心写了一篇Cookie、Session和Token的 vivid 文章&#xff0c;并分享给大家 我们可以把Cookie、Token和Session看作是三个好基友&#xff0c;它们…

Linux中创建sftp用户并限制目录权限

注意两点&#xff1a; 一是禁止该用户通过ssh登录&#xff0c;二是不需要创建家目录。家目录简单来说&#xff0c;就是在/home下的用户命令&#xff0c;默认每个用户在/home中都是有与用户名一样的文件夹。 1.创建组 groupadd sftp 2. 创建用户 useradd -g sftp -s /sbin/…

Vue3 JSX 插槽、v-model 的用法以及 React JSX 的区别

前言 写这篇文章的初衷是&#xff0c;Vue3 JSX 部分与 React JSX 容易混淆&#xff0c;比如如本文所说的 slot & v-model&#xff0c; 如果你是第一次接触 JSX&#xff0c;可先阅读前面写过的 React & JSX 日常用法与基本原则 来对 JSX 有一个整体的认知以及比较两者间…