有趣的设计模式——站在富士康的厂房里看建造者设计模式


版权声明


建造者模式简介

建造者模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。看到这个文绉绉的定义,多半是一头雾水。没事儿,咋们用大白话来说:建造者模式是创建复杂对象的模型,它将构建的过程和所用的部件解耦从而使得构建过程和所用部件分离开。

举个例子:很多手机厂商与富士康合作生产手机,而且手机厂商对于手机的CPU,主板,内存,屏幕的要求各不相同。对于富士康而言,它需要去了解CPU的性能,内存的大小,屏幕的分辨率这些部件的详细的技术信息么?不需要,作为代工厂商它不需要深入了解部件,它所关注的是:拿到手机厂商提供的各个部件组装成手机就行!对于,手机厂商而言,它需要去了解富士康的生成状况,人员流动,组装过程么?不需要,作为手机厂商,它所关注的是:把各个部件给富士康,至于怎么组装那是富士康的事!

这就是部件与构建过程的分离。通过该方式,两者的耦合也降到了最低。继续刚才的例子:富士康不但可以给联想装配手机,还能给苹果装配手机,只要手机厂商提供所需的部件就行。类似地,假若苹果不想和富士康合作了,它将部件交给另外的代工厂商穷士康也是完全可以的,至于手机组装过程它依然无需关注。

在建造者模式中,有如下四个角色:

  • Director : 导演类。导演类也称为指挥者类,它负责安排组装过程。比如可以安排Builder先构造哪个部分,后构造哪个部分。而且,在在指挥者中不涉及具体产品的信息。

  • Builder : 抽象的建造者类。Builder负责规范产品的组建,一般由其子类实现具体的构建过程。

  • ConcreteBuilder : 具体的建造者类。该建造者实现Builder的所有方法,并返回构件好的对象。

  • Product:产品类。产品类表示产品的具体信息。


建造者模式示例

通过之前的介绍,我们对于建造者模式有了初步的理解,现在我们通过一个完整的示例进一步了解建造者模式

产品类

package cn.com;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class Mobile {
	
	private String cpu;
	private String mainboard;
	private String memory;
	private String screen;
	
	public String getCpu() {
		return cpu;
	}
	public void setCpu(String cpu) {
		this.cpu = cpu;
	}
	public String getMainboard() {
		return mainboard;
	}
	public void setMainboard(String mainboard) {
		this.mainboard = mainboard;
	}
	public String getMemory() {
		return memory;
	}
	public void setMemory(String memory) {
		this.memory = memory;
	}
	public String getScreen() {
		return screen;
	}
	public void setScreen(String screen) {
		this.screen = screen;
	}
	@Override
	public String toString() {
		return "Mobile [cpu=" + cpu + ", mainboard=" + mainboard + ", memory=" + memory + ", screen=" + screen + "]";
	}
		
}

这是我们的手机产品类,它包含了CPU,主板,内存,屏幕等部件。

抽象的建造者类

package cn.com;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public abstract class Builder {
	public abstract void buildCpu(String cpu);
	public abstract void buildMainboard(String mainboard);
	public abstract void buildMemory(String memory);
	public abstract void buildScreen(String screen);
	public abstract Mobile create();
}

该负责建造者抽象类中规范产品的组建。

具体的建造者类

package cn.com;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class MobileBuilder extends Builder {
	private Mobile mobile=new Mobile();
	@Override
	public void buildCpu(String cpu) {
		mobile.setCpu(cpu);
	}

	@Override
	public void buildMainboard(String mainboard) {
		mobile.setMainboard(mainboard);
	}

	@Override
	public void buildMemory(String memory) {
		mobile.setMemory(memory);
	}

	@Override
	public void buildScreen(String screen) {
		mobile.setScreen(screen);
	}

	@Override
	public Mobile create() {
		return mobile;
	}

}

具体建造类实现抽象建造类(Builder)的所有方法,并返回构件好的对象。

导演类

package cn.com;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class MobileDirector {
	Builder builder=null;
	public MobileDirector(Builder builder) {
		this.builder=builder;
	}
	
	public Mobile createMobile(String cpu,String mainboard,String memory,String screen) {
		this.builder.buildCpu(cpu);
		this.builder.buildMainboard(mainboard);
		this.builder.buildMemory(memory);
		this.builder.buildScreen(screen);
		Mobile mobile = this.builder.create();
		return mobile;
	}

}

该导演类安排组装过程。例如在此处指定先构建CPU再构建主板和内存,最后构建屏幕。

客户端

嗯哼,关于建造者模式的四个角色都已经就位了,我们来瞅瞅客户端的代码。

package cn.com;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class TestBuilderPattern {

	public static void main(String[] args) {
		Builder builder=new MobileBuilder();
		MobileDirector mobileDirector=new MobileDirector(builder);
		Mobile mobile = mobileDirector.createMobile("高通cpu", "华为主板", "东芝内存", "夏普屏幕");
		System.out.println(mobile);
	}

}

在客户端中我们将部件传递给导演类,导演类返回构件好的产品给客户端。对于客户端而言,它无需过多关注构建的过程;对于导演类来说,它无需过多关注部件的细节。


建造者模式的应用

建造者模式主要适用于以下应用场景:

  • 相同的方法,不同的执行顺序,产生不同的结果。
  • 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
  • 产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
  • 初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。

在实际开发中,建造者模式作为常见的设计模式被广泛应用

  • StringBuilder
    嗯哼,这个熟悉吧,不再赘述

  • SqlSessionFactoryBuilder
    哇哈,我们在《 Mybatis研习录》中也用到了这个玩意儿

  • AlertDialog.Builder
    做Android开发的小伙伴,是不是从入门开始就已经开始用了呢?

  • Retrofit
    目前,Android开发领域火爆的网络框架Retrofit也用到了建造者模式。我们通常这么写:

    Retrofit retrofit = new Retrofit.Builder()
     .baseUrl("https://api.github.com/")
     .build();
    

    当然,除了建造者模式以外,Retrofit还用多了众多设计模式使其成为优秀的网络请求框架。至于Retrofit的深入剖析请参见《Retrofit分析-漂亮的解耦套路》

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷哥的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值