英文叫Builder Pattern。其核心思想是将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。简而言之,具有同样的创建工序,不同的细节,创建出的同一对象,但是又具有不同的属性的对象;比如不同的人炒一道菜,流程都是一样的,但是由于经验的不同,或者工序顺序不一样,导致细节上的差别,做出来的菜的味道就不一样。
适用的范围
1. 相同的方法,顺序不同产生的产品不一样。
2. 多个属性,拼装时不同拼装出来的产品也不一样。
3. 产品类复杂,或者产品类中的调用顺序不同产生了不同的效能。
就那最经典的案例制作汽车来说,根据现在的需求多样化,生产单一的汽车不现实,就需要根据不同的需求制作出不同的汽车。
第一步:创建汽车类Car 有三个属性
package com.example.fwms.designmode.build;
/**
* Created by FWMS on 2017/6/10.
*/
public class Car {
private String color;//颜色
private int height;//高度
private String power;//动力
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getHeight() {
return height;
}
public void setHeight(int hight) {
this.height = hight;
}
public String getPower() {
return power;
}
public void setPower(String power) {
this.power = power;
}
}
第二步 设计接口 将方法抽象出来
package com.example.fwms.designmode.build;
/**
* 创建 by 刘宇飞 on 2017/6/10.
* 邮箱:3494576680@qq.com
* 描述
*/
public abstract class CarBuilder {
protected Car car=new Car();
public abstract CarBuilder setColor(String color);
public abstract CarBuilder setHeight(int height);
public abstract CarBuilder setPower(String power);
public abstract Car create();
}
第三步 实现接口方法
package com.example.fwms.designmode.build;
/**
* 创建 by 刘宇飞 on 2017/6/10.
* 邮箱:3494576680@qq.com
* 描述
*/
public class SUVCarBuilder extends CarBuilder {
@Override
public CarBuilder setColor(String color) {
car.setColor(color);
return this;
}
@Override
public CarBuilder setHeight(int height) {
car.setHeight(height);
return this;
}
@Override
public CarBuilder setPower(String power) {
car.setPower(power);
return this;
}
@Override
public Car create() {
return car;
}
}
最后一步 创建对象
private void createBuil() {
CarBuilder builder = new SUVCarBuilder();
Car car = builder.setColor("黑色")
.setPower("2.0T")
.setHeight(2)
.create();
showToast(getApplicationContext(),car.getColor()+"!"+car.getPower()+"!"+car.getHeight());
}
到此结束了,有木有感觉有些蛋疼,直接car.setColor() 不就好了吗,还创建了这么多类,闲的蛋疼。
哈哈,我来说明一下为什么还这样做,假如你需要一辆车,指定了各种参数,人家给你做出来了,但是你知道是怎么做的吗,具体流程是什么,你完全不知道,也不用知道。案例build.setColor() 其实里面隐藏了制作过程,这就达到了代码的复用。
在开发中慢慢体会吧。