当前位置: 首页 > news >正文

设计模式 -- 建造者模式(Builder Pattern)

这个模式以前也义Android-kotlin的场景下讲过 Android 用建造者模式模式写一个Dialog-CSDN博客
不过用的是 变种的建造者模式
建造者模式: 属于创建型模式 提供了一种创建对象的最佳方式, 使用多个简单的对象一步一步构建成一个复杂的对象
介绍
  • 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
  • 主要解决问题:一些基本部件不会变,而其组合经常变化的时候。需要生成的对象具有复杂的内部结构,需要生成的对象内部属性本身相互依赖。
  • 关键代码:实现与被代理类组合。
  • 优点:1、建造者独立,易扩展。 2、便于控制细节风险。
  • 缺点:1、产品必须有共同点,范围有限制。 2、如果内部变化复杂,会有很多的建造类。

 以建造一个三角形圆形矩形的图形为例

  1. 角色类:包含多个组成部件的复杂对象
    public class Shape {private String triangle;private String circular;private String rectangle;public void setTriangle(String triangle) {this.triangle = triangle;}public void setCircular(String circular) {this.circular = circular;}public void setRectangle(String rectangle) {this.rectangle = rectangle;}public void draw() {//使用得到的具体的三角形圆形矩形绘制一个图形}
    }
  2. 抽象建造者:包含创建产品各个子部件的抽象方法
    abstract class Builder {protected Shape shape = new Shape();public abstract void buildTriangle();public abstract void buildCircular();public abstract void buildRectangle();public Shape getShape() {return shape;}
    }
  3. 具体建造者:实现了抽象建造者接口
    public class ConcreteBuilder1 extends Builder{@Overridepublic void buildTriangle() {shape.setTriangle("建造 红色三角形");}@Overridepublic void buildCircular() {shape.setCircular("建造 蓝色圆形");}@Overridepublic void buildRectangle() {shape.setRectangle("建造 绿色矩形");}
    }
    public class ConcreteBuilder2 extends Builder{@Overridepublic void buildTriangle() {shape.setTriangle("建造 青色三角形");}@Overridepublic void buildCircular() {shape.setCircular("建造 蓝色圆形");}@Overridepublic void buildRectangle() {shape.setRectangle("建造 紫色矩形");}
    }
  4. 指挥者:调用建造者中的方法完成复杂对象的创建。
    public class Director {private Builder builder;public Director(Builder builder) {this.builder = builder;}//产品构建与组装方法public Shape construct() {builder.buildTriangle();builder.buildCircular();builder.buildRectangle();return builder.getShape();}
    }
  5. 使用
        public static void main(String[] args) {Builder builder = new ConcreteBuilder1();Director director = new Director(builder);Shape shape = director.construct();shape.draw();builder = new ConcreteBuilder2();director = new Director(builder);shape = director.construct();shape.draw();}
http://www.lryc.cn/news/232183.html

相关文章:

  • 如何下载 Apache + PHP + Mysql 集成安装环境并结合内网穿透工具实现公网访问内网服务
  • 一招告别百度广告烦恼,同时效率提高100倍的几个常用搜索技巧!
  • 文件上传 [ACTF2020 新生赛]Upload1
  • 振南技术干货集:比萨斜塔要倒了,倾斜传感器快来!(1)
  • 手把手教你搭建属于自己的快递小程序
  • C# Onnx LSTR 基于Transformer的端到端实时车道线检测
  • Java相关编程思想
  • Hadoop-HDFS架构与设计
  • OpenAI暂停新的ChatGPT Plus注册 | OpenAI 的 GPT Builder 创建您的 GPTs
  • Git目录不对,即当前文件夹不对应git仓库
  • Python基础:正则表达式(regular expression)详解
  • sqlmap requires ‘python-pymysql‘ third-party library
  • 05 robotFrameWork+selenium2library 一维数组的使用
  • SpringCloud Alibaba组件入门全方面汇总(上):注册中心-nacos、负载均衡-ribbon、远程调用-feign
  • Zabbix钉钉机器人告警
  • unity shaderGraph实例-扫描效果
  • AW2013芯片讲解
  • Spring JdbcTemplate Junit 测试 - ResultSetExtractor/RowMapper
  • RabbitMQ实战
  • UI游戏设计模板大放送:7种别具匠心的创意!
  • 酷开系统 酷开科技,将家庭娱乐推向新高潮
  • 我精心制作的 python 一小时极简课程来了 ≧◠◡◠≦ 免安装程序+精简核心概念
  • 220V交流转直流的简易电源设计
  • 使用Nginx和uwsgi在自己的服务器上部署python的flask项目
  • 【Windows 开发环境配置——NVIDIA 篇】CUDA、cuDNN、TensorRT 三件套安装
  • 【C++】【Opencv】cv::GaussianBlur、cv::filter2D()函数详解和示例
  • 【数据分享】1961—2022年全国范围的逐日降水栅格数据
  • [Linux] 网络文件共享服务
  • 二十七、W5100S/W5500+RP2040树莓派Pico<iperf 测速示例>
  • 非常经典的一道SQL报错注入题目[极客大挑战 2019]HardSQL 1(两种解法!)