设计模式 - 建造者模式

有一天,我多个场景需要调用某个实体类,但是不同场景下实体类传入的参数不同,所以就导致我重写了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());
    }
}

输出结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_20451879/article/details/114870803