什么是Builder模式
将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。
Builder模式是一步一步来创建复杂对象的过程。该模式将复杂对象的构建过程和他的组成解耦来实现隔离。
比如我们要造一辆东风汽车,他的实现需要轮胎、引擎、方向盘、车门……等等很多部件,使用Builder模式将组装车的过程和部件生产分离开来,自己管的事也少了,想要扩展也方便了。
什么情况下适合使用Builder模式
当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式以及当构造过程必须允许构造的对象有不同的表示;
Builder模式实现
还是来造东风汽车吧:
- Builder抽象Builder类 —规范产品的组件,在子类中实现具体组件操作
- Director组装类 —统一组装过程
- ProductBuilder类 —汽车产品的具体Builder类
东风汽车Builder类:
public abstract class Builder{
String mEngine;//引擎
String mTire;//轮胎
abstract void builderEngine();
abstract void builderTire();
void create(){
System.out.println(mEngine);
System.out.println(mTire);
}
}
ProductBuilder具体产品类:
public class ProductBuilder extends Builder{
void builderEngine(){
mEngine = "国产引擎";
}
void builderTire(){
mTire = "国产轮胎";
}
}
Director组装类:
public class Director{
Builder builder;
public Director(Builder mBuilder){
builder = mBuilder;
}
void create(){
builder.builderEngine();
builder.builderTire();
builder.create();
}
}
测试类造汽车:
public class Test{
public static void main(String[] args){
Builder builder = new ProductBuilder;
Director director = new Director(builder);
director.create();
}
}
输出结果:
国产引擎
国产轮胎
至此,一辆东风汽车就造好了。是不是用到了迪米特原则(最少知道原则)。
Director封装了复杂的制造过程,对外隐藏了制造细节,一定程度上起到了保密作用。
Builder负责汽车的组件,他与Director一起将这个汽车复杂的构建与表示分离开来。假如我们现在需要创建进口汽车,只需要增加类似ProductBuilder产品类即可,指定配件后然后指定new Builder的类型接下来就大同小异。
Builder进阶
在实际开发中我们还会省略Director角色:
new ProductBuilder().setEngine("国产引擎").setTire("国产轮胎").create();
以上代码要修改为:
Builder类:
public abstract class Builder{
String mEngine;//引擎
String mTire;//轮胎
public String getmEngine() {
return mEngine;
}
//要注意这里返回要返回Builder类
public Builder setmEngine(String mEngine) {
this.mEngine = mEngine;
return this;
}
public String getmTire() {
return mTire;
}
public Builder setmTire(String mTire) {
this.mTire = mTire;
return this;
}
abstract void builderEngine();
abstract void builderTire();
abstract void create();
}
ProductBuilder类:
public class ProductBuilder extends Builder{
void builderEngine(){
mEngine = "国产引擎";
}
void builderTire(){
mTire = "国产轮胎";
}
public void create() {
System.out.println(mEngine);
System.out.println(mTire);
}
}
测试类:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Builder builder = new ProductBuilder();
builder.setmEngine("国产引擎").setmTire("进口轮胎").create();
}
}
运行结果:
国产引擎
进口轮胎
实际开发中我们经常这样用,比如Android中的:
Toast.makeText(getApplicationContext(), "你好", Toast.LENGTH_SHORT).show();
这里他实际上是new 了一个新Toast对象,和上边我们调用Builder一样属于,链式调用,每个setter方法都
会返回自身,也就是return this,这样调用结束就还是本身对象可以继续调用其他方法。注意返回自身,如
果忘了这一步,是会出错的。