设计模式 - 建造者模式
有一天,我多个场景需要调用某个实体类,但是不同场景下实体类传入的参数不同,所以就导致我重写了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());}
}
输出结果
设计模式 - 建造者模式相关推荐
- Python设计模式-建造者模式
Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...
- 说说设计模式~建造者模式(Builder)
建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...
- 设计模式 建造者模式_设计模式:建造者
设计模式 建造者模式 有时需要在应用程序中创建一个复杂的对象. 一种解决方案是Factory模式,另一种是Builder设计模式. 在某些情况下,您甚至可以结合使用这两种模式. 但是在本文中,我想研究 ...
- 设计建造者模式java代码,Java设计模式-建造者模式
定义 Separate the construction of a complex object from its representation so that the sameconstructio ...
- python创造者_python 设计模式-建造者模式
问题:在上一篇python设计模式:抽象工厂模式中,我们尝试用抽象工厂模式规范化了 Pizza 原材料的供应以及 Pizza 的创建.但是我们忽略了一个问题,那就是每种 Pizza 的烘焙时间依赖于生 ...
- java设计模式-建造者模式
概念:使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. ...
- 设计模式-建造者模式(转自:http://www.cnblogs.com/cbf4life/archive/2010/01/14/1647710.html)...
11.1 变化是永恒的 又是一个周三,快要下班了,老大突然拉住我,喜滋滋地告诉我:"牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制作了,不过这次又额外增 ...
- 大话设计模式—建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类会一步一步构造最 ...
- 我的Java设计模式-建造者模式
在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...
- Java常用设计模式————建造者模式
引言 建造者模式(Builder Pattern)使用多个简单对象一步一步构建成一个复杂的对象.这种类型的设计模式属于建造型模式,它提供了一种创建对象的最佳方式. 一个Builder会一步步构建最终的 ...
最新文章
- 自动化控制之线程池的使用
- git add 之后因为没提交正确文件需要撤销
- PXE+Kickstart实现无人值守批量安装Linux
- linux里hba状态_linux查看hba卡状态
- 计量经济学和机器学习方法的在假设上的区别
- 带头尾指针的list的C实现
- 机器学习总结(17)-XGBoost
- Laravel框架学习笔记(一)——phpstudy下的安装配置
- 19. web root (2)
- 空间矢量脉冲宽度调制(SVPWM)Simulink仿真教程
- 【开篇】抽象代数的历史背景与内容总览
- AirPlay to Mac 如何工作以及使用它需要什么?
- 微信小程序 input ,阻止冒泡事件,catchtap的使用
- Strick mode 和Trace View使用
- oracle异地双活距离,再谈异地双活容灾部署(6.24)
- 视频怎么更换封面图片,视频封面更换的步骤演示
- Openstack 虚拟机云盘扩容
- HandyJSON实现方案浅析
- 实验五 大学数据库系统中,使用游标编写存储过程,输入学号查询成绩
- 查重时的疑惑:一个字一个字手写的论文怎么查重率就46%?