有一天,我多个场景需要调用某个实体类,但是不同场景下实体类传入的参数不同,所以就导致我重写了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;
}
@Override
public 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);
}
@Override
public void setBrother() {
familyMember.setBrother("一个弟弟");
}
@Override
public void setSister() {
familyMember.setSister("一个妹妹");
}
@Override
public 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);
}
@Override
public void setBrother() {
familyMember.setBrother("没有兄弟");
}
@Override
public void setSister() {
familyMember.setSister("没有姐妹");
}
@Override
public 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 {
@Override
protected 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;
}
@Override
public 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 {
@Override
protected 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());
}
}
输出结果