【设计模式】Builder模式

一、前言

设计模式系列(参考资料:《Android源码设计模式解析与实战》——何红辉、关爱明)
单例模式
Builder模式
原型模式

二、介绍

我们开发中偶尔会遇到一些需要设置10个或以上大量参数的情况,通常情况有几种处理方式:多构造函数、setterBuilder模式

  • 1、多构造函数:这种方式虽然最方便,但也最繁琐,假设有一个方法需要设置6int型的参数,但多数情况下,这6个中总有你不想传的参数,这时候就需要约定一个规则:例如传0,但是传0又会有一个问题就是传入顺序问题,传入顺序不同并不会导致程序编译不通过,却会导致程序运行结果不正确。所以这并不是一种好方式
  • 2、setter
    虽然它可以解决多构造带来的传入顺序问题,但是它还是略显繁琐了。所以我们通常只会在JavaBean中使用setter
  • 3、Builder模式
  • 本文要介绍的一种方式,可以完美解决上述两种方式带来的弊端,让代码更加符合设计模式。参考GlideRetrofit的使用方式,它们都是通过链式调用一个一个参数连接起来的



三、定义

Builder的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示



四、使用场景

主要强调两点:调用顺序多参数

  • 1、相同的方法,不同的执行顺序,需要产生不同的事件结果时
  • 2、多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同的时候
  • 3、产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用时
  • 4、当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时



五、UML图

Builder

背景:我要建造一个xsic
在这个背景下,Productxsic的抽象,也就是人,ConcreteBuilder是一个具体Builder类,继承了抽象BuilderBuilder,而Director可以是一个高层客户端模块,也可以是一个为高层客户端模块提供构建功能的中间模块



六、举例

1、抽象产品类,在UML中没有具体体现

	public abstract class Person {
   
	    protected String mHead;
	    protected int mBody;
	    protected String mArm;
	    protected String mLeg;
	    protected String mHair;
	
	    public abstract void setHead(String head);
	
	
	    public abstract void setBody(int body);
	
	    public void setmArm(String mArm) {
   
	        this.mArm = mArm;
	    }
	
	    public void setmLeg(String mLeg) {
   
	        this.mLeg = mLeg;
	    }
	
	    public void setmHair(String mHair) {
   
	        this.mHair = mHair * mBody;
	    }
	}

2、具体产品类,对应UML中的Product

	public class Xsic extends Person {
   
	
	    public Xsic() {
   
	    }
	
	    @Override
	    public void setHead(String head) {
   
	        mHead = "默认头";
	    }
	
	    @Override
	    public void setBody(int body) {
   
	        mBody = 1;
	    }
	}

3、抽象Builder类,对应UML中的Builder

	public abstract class Builder {
   
	    public abstract Builder buildHead(String head);
	    public abstract Builder buildBody(int body);
	    public abstract Builder buildArm(String arm);
	    public abstract Builder buildLeg(String leg);
	    public abstract Builder buildHair(String hair);
	    public abstract Person build();
	}

4、具体Builder类,对应UML中的ConcreteBuilder

	public class XsicBuilder extends Builder {
   
	    private Xsic xsic = new Xsic();
	
	    @Override
	    public Builder buildHead(String head) {
   
	        xsic.setHead(head);
	        return this;
	    }
	
	    @Override
	    public Builder buildBody(int body) {
   
	        xsic.setBody(body);
	        return this;
	    }
	
	    @Override
	    public Builder buildArm(String arm)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值