有一天,我多个场景需要调用某个实体类,但是不同场景下实体类传入的参数不同,所以就导致我重写了N个构造方法 ~ 无力吐槽,所以就想到了建造者模式 ~

设计模式共23种,分为三种类型

  • 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
  • 结构型模式:代理模式、装饰模式、外观模式、享元模式、桥接模式、组合模式、适配器模式
  • 行为型模式:观察者模式、策略模式、中介者模式、模版方法模式、命令模式、迭代器模式、职责链模式(责任链模式)、备忘录模式、解释器模式(Interpreter模式)、状态模式、访问者模式

初秋和你

  • 基础概念
  • 我的栗子
    • 传统实现
    • 项目实现

基础概念

建造者模式,有人也称其为构造者模式,主要解决了一个类复杂多变的构造参数问题 ~

什么是复杂构造参数?如下就是咯

/*** desc 家庭成员组成*/
class FamilyMember {private String mother;private String father;private String me;private String brother;private String sister;public FamilyMember(String father) {this.father = father;}public FamilyMember(String father, String mother) {this.father = father;this.mother = mother;}public FamilyMember(String father, String mother, String me) {this.father = father;this.mother = mother;this.me = me;}public FamilyMember(String father, String mother, String me, String brother) {this.father = father;this.mother = mother;this.me = me;this.brother = brother;}public FamilyMember(String father, String mother, String me, String brother, String sister) {this.father = father;this.mother = mother;this.me = me;this.brother = brother;this.sister = sister;}
}

建造者模式如大多数设计模式一样,他的组成往往也有抽象类和具体实现类,主要区别在于适应场景的不同,其角色划分如下 ~

  • 产品类
    也称为需求类,往往需要针对不同场景返回不同方案,内部包含必有参数和选有参数

  • 抽象建造者
    也称为方案备选者,主要为了解决负责多变的场景方案,其实现方式可以采用接口方式,也可以采用抽象继承类的方式,内部包含需要重写的方法和生成产品类的方法

  • 具体建造者
    也称为方案具体执行者,一般可继承抽象类或实现接口,然后传入产品类必有参数后,重写其内部方法

  • 导演类
    顾名思义,其实就是产品类与建造者之间的一个关联类,通过导演类将对应的具体抽象类传入后生成对应的可用产品类

关于建造者模式的俩种实现方式

  • 传统方式

该方式主要是便于新手理解角色划分、角色职责与模式实现的过程(感觉部分思想和策略模式蛮像的,针对不同的需求传入不同的具体对象,只是具体对象内加入了必有的方法组成,然后重写了可选方法)

  • 项目方式

该方式不同于传统方式,更适合项目中使用,而且在各类语言中该写法也很常见,为主流写法,主要特色在于动态生成具体建造者,而且语法相对灵活多变,容易让人写的上瘾

感悟:单纯角色划分和实现的话与策略模式有相似之处 ~


我的栗子

生活中我们每个家庭的组成大多都不相同,但是不论怎样我们的家庭成员中至少拥有父亲、母亲和自己,至于有没有兄弟姐妹那么针对不同的家庭也就有了不同的组成,所以我们的产品类中有必传参数,也有选传参数;故我们的产品类就来源于此 ~

传统实现

嘘… 个人二次感觉传统的实现方式和 策略模式 还是有丢丢像,或许说是设计模式有些思想还是蛮共通的 ~

产品类 - FamilyMember

package com.example.builderdemo;/*** @author MrLiu* @date 2021/2/26* desc 产品类 - 家庭成员*/
class FamilyMember {//必有private String mother;//必有private String father;//必有private String me;//选有private String brother;//选有private String sister;public FamilyMember(String father, String mother, String me) {this.father = father;this.mother = mother;this.me = me;}public String getMother() {return mother;}public void setMother(String mother) {this.mother = mother;}public String getFather() {return father;}public void setFather(String father) {this.father = father;}public String getMe() {return me;}public void setMe(String me) {this.me = me;}public String getBrother() {return brother;}public void setBrother(String brother) {this.brother = brother;}public String getSister() {return sister;}public void setSister(String sister) {this.sister = sister;}@Overridepublic String toString() {return "家庭成员组成(Family):{" +"mother='" + mother + '\'' +", father='" + father + '\'' +", me='" + me + '\'' +", brother='" + brother + '\'' +", sister='" + sister + '\'' +'}';}
}

抽象创建者 - FamilyBuilder

package com.example.builderdemo;/*** @author MrLiu* @date 2021/2/26* desc 抽象建造者*/
interface FamilyBuilder {public void setBrother();public void setSister();public FamilyMember createFamily();
}

具体建造者 - JackFamilyBuild

package com.example.builderdemo;/*** @author MrLiu* @date 2021/2/26* desc 具体建造者 - Jack家庭组成*/
class JackFamilyBuild implements FamilyBuilder {FamilyMember familyMember;public JackFamilyBuild(String father, String mother, String me) {familyMember = new FamilyMember(father, mother, me);}@Overridepublic void setBrother() {familyMember.setBrother("一个弟弟");}@Overridepublic void setSister() {familyMember.setSister("一个妹妹");}@Overridepublic FamilyMember createFamily() {return familyMember;}
}

具体建造者 - TomFamilyBuilder

package com.example.builderdemo;/*** @author MrLiu* @date 2021/2/26* desc 具体建造者 - Tom家庭组成*/
class TomFamilyBuilder implements FamilyBuilder {FamilyMember familyMember;public TomFamilyBuilder(String father, String mother, String me) {familyMember = new FamilyMember(father, mother, me);}@Overridepublic void setBrother() {familyMember.setBrother("没有兄弟");}@Overridepublic void setSister() {familyMember.setSister("没有姐妹");}@Overridepublic FamilyMember createFamily() {return familyMember;}
}

导演类 - FamilyDirector

package com.example.builderdemo;/*** @author MrLiu* @date 2021/2/26* desc 导演类*/
class FamilyDirector {public FamilyMember familyPeople(FamilyBuilder builder){builder.setBrother();builder.setSister();return builder.createFamily();};
}

使用场景

package com.example.builderdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//创建导演类FamilyDirector familyDirector = new FamilyDirector();//----------------------常规---------------------////创建具体建造者JackFamilyBuild jackFamilyBuilder = new JackFamilyBuild("父亲", "母亲", "我");//通过导演类传入对应构造角色信息familyDirector.familyPeople(jackFamilyBuilder);//生成对应建造者FamilyMember jackFamilyMember = jackFamilyBuilder.createFamily();//查看效果System.out.println(jackFamilyMember.toString());Log.e("tag", "Jack" + jackFamilyMember.toString());//----------------------导演类封装返回体---------------------////创建具体建造者TomFamilyBuilder tomFamilyBuilder = new TomFamilyBuilder("父亲", "母亲", "我");//通过导演类传入对应构造角色信息,并生成对应建造者FamilyMember familyMember = familyDirector.familyPeople(tomFamilyBuilder);//查看效果System.out.println(familyMember.toString());Log.e("tag", "Tom" + familyMember.toString());}
}

输出结果


项目实现

产品类 - FamilyMember

package com.example.builderdemo;/*** @author MrLiu* @date 2021/2/26* desc 产品类 - 家庭成员*/
class FamilyMember {//必有private String mother;//必有private String father;//必有private String me;//选有private String brother;//选有private String sister;public FamilyMember(Builder builder) {this.father = builder.father;this.mother = builder.mother;this.me = builder.me;this.brother = builder.brother;this.sister = builder.sister;}@Overridepublic String toString() {return "家庭成员组成(Family):{" +"mother='" + mother + '\'' +", father='" + father + '\'' +", me='" + me + '\'' +", brother='" + brother + '\'' +", sister='" + sister + '\'' +'}';}/*** 建造者*/public static class Builder {//必有private String mother;//必有private String father;//必有private String me;//选有private String brother;//选有private String sister;public Builder(String father, String mother, String me) {this.father = father;this.mother = mother;this.me = me;}public Builder setBrother(String brother) {this.brother = brother;return this;}public Builder setSister(String sister) {this.sister = sister;return this;}public FamilyMember build() {return new FamilyMember(this);}}
}

使用方式

package com.example.builderdemo;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.util.Log;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);FamilyMember familyMember = new FamilyMember.Builder("父亲", "母亲", "我").setBrother("一个姐姐").setSister("一个妹妹").build();Log.e("tag", "familyMember" + familyMember.toString());}
}

输出结果

设计模式 - 建造者模式相关推荐

  1. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  2. 说说设计模式~建造者模式(Builder)

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

  3. 设计模式 建造者模式_设计模式:建造者

    设计模式 建造者模式 有时需要在应用程序中创建一个复杂的对象. 一种解决方案是Factory模式,另一种是Builder设计模式. 在某些情况下,您甚至可以结合使用这两种模式. 但是在本文中,我想研究 ...

  4. 设计建造者模式java代码,Java设计模式-建造者模式

    定义 Separate the construction of a complex object from its representation so that the sameconstructio ...

  5. python创造者_python 设计模式-建造者模式

    问题:在上一篇python设计模式:抽象工厂模式中,我们尝试用抽象工厂模式规范化了 Pizza 原材料的供应以及 Pizza 的创建.但是我们忽略了一个问题,那就是每种 Pizza 的烘焙时间依赖于生 ...

  6. java设计模式-建造者模式

    概念:使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. ...

  7. 设计模式-建造者模式(转自:http://www.cnblogs.com/cbf4life/archive/2010/01/14/1647710.html)...

    11.1 变化是永恒的 又是一个周三,快要下班了,老大突然拉住我,喜滋滋地告诉我:"牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制作了,不过这次又额外增 ...

  8. 大话设计模式—建造者模式

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类会一步一步构造最 ...

  9. 我的Java设计模式-建造者模式

    在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...

  10. Java常用设计模式————建造者模式

    引言 建造者模式(Builder Pattern)使用多个简单对象一步一步构建成一个复杂的对象.这种类型的设计模式属于建造型模式,它提供了一种创建对象的最佳方式. 一个Builder会一步步构建最终的 ...

最新文章

  1. 自动化控制之线程池的使用
  2. git add 之后因为没提交正确文件需要撤销
  3. PXE+Kickstart实现无人值守批量安装Linux
  4. linux里hba状态_linux查看hba卡状态
  5. 计量经济学和机器学习方法的在假设上的区别
  6. 带头尾指针的list的C实现
  7. 机器学习总结(17)-XGBoost
  8. Laravel框架学习笔记(一)——phpstudy下的安装配置
  9. 19. web root (2)
  10. 空间矢量脉冲宽度调制(SVPWM)Simulink仿真教程
  11. 【开篇】抽象代数的历史背景与内容总览
  12. AirPlay to Mac 如何工作以及使用它需要什么?
  13. 微信小程序 input ,阻止冒泡事件,catchtap的使用
  14. Strick mode 和Trace View使用
  15. oracle异地双活距离,再谈异地双活容灾部署(6.24)
  16. 视频怎么更换封面图片,视频封面更换的步骤演示
  17. Openstack 虚拟机云盘扩容
  18. HandyJSON实现方案浅析
  19. 实验五 大学数据库系统中,使用游标编写存储过程,输入学号查询成绩
  20. 查重时的疑惑:一个字一个字手写的论文怎么查重率就46%?

热门文章

  1. 最简单!阿里云服务器采用 LNMP一键安装包 配置 Linux+Nginx+Mysql+PHP
  2. Java 各种单例模式实现代码
  3. 微信小程序如何上传图片
  4. 自动将视频文件生成字幕的软件autosub的替代工具字幕酱(支持英文、日语和法语、德语、韩语)
  5. 简单计算机电脑病毒实验,简单的电脑病毒程序
  6. 区块链--大白话说明
  7. python 中文乱码问题深入分析
  8. 软件项目开发各阶段文档模板(参考)
  9. Linux C/C++内存映射
  10. STM8L低功耗停止看门狗