建造者模式
定义:建造者模式:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
在建造者模式中,角色分指导者(Director)与建造者(Builder): 用户联系指导者, 指导者指挥建造者, 最后得到产品. 建造者模式可以强制实行一种分步骤进行的建造过程.
适用的范围
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
- 当构造过程必须允许被构造的对象有不同表示时
实例
我一直觉得文字上的语言并不能很快的让学习者深刻理解其中的逻辑,就贴合一个例子来探明其中的关系。
需求现在需要生产一批汽车,其中有卡车,小轿车,和客车。那么先分析共性,卡车,小轿车和客车的组成部分都有车轮,车壳和底盘(当然实际情况不止这三个~)那好,我们一步一步来做;
- 1 我们明确了一个车的共性,那就不妨先创建一个Car的对象
/**
* Created by melo on 2017/2/8.
* 共性Car对象
*/
public class Car {
private String wheels;
private String carShell;
private String chassis;
public String getWheels() {
return wheels;
}
public void setWheels(String wheels) {
this.wheels = wheels;
}
public String getCarShell() {
return carShell;
}
public void setCarShell(String carShell) {
this.carShell = carShell;
}
public String getChassis() {
return chassis;
}
public void setChassis(String chassis) {
this.chassis = chassis;
}
}
- 其次,有了共性car对象后,我们需要创建一个builder角色的CarBuilder接口来定义一个对象各个组成部分的接口
/**
* Created by melo on 2017/2/8.
* Builder创建者角色,定义一个对象各个组成部分的接口
*/
public interface CarBuilder {
//车轮
void buildWheels();
//车壳
void buildCarShell();
//底盘
void buildChassis();
//返回car对象
Car buildCar();
}
- 那么有了builder创建者和car对象的接口后,我们需要一个指挥builder进行创建的指挥者Director
/**
* Created by melo on 2017/2/8.
* Director角色,指挥创建car对象
*/
public class CarDirector {
//传入创建者,Director指挥其进行对象的创建
public Car constructCar(CarBuilder cb) {
cb.buildCarShell();
cb.buildChassis();
cb.buildWheels();
return cb.buildCar();
}
}
- 好了,到目前为止我们所需要的基本条件已经做完了,那么我们就随心所欲的来生产一台自己的小轿车吧
/**
* Created by melo on 2017/2/8.
* 构造小轿车
*/
public class SmallCarBuilder implements CarBuilder {
Car mCar;
public SmallCarBuilder(){
mCar=new Car();
}
@Override
public void buildWheels() {
}
@Override
public void buildCarShell() {
}
@Override
public void buildChassis() {
}
@Override
public Car buildCar() {
return mCar;
}
}
- 好啦,看看效果吧~
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CarDirector carDirector=new CarDirector();
Car smallCar=carDirector.constructCar(new SmallCarBuilder());
smallCar.setWheels("纯金车轮");
smallCar.setCarShell("纯金车壳");
smallCar.setChassis("纯金底盘");
Log.i("tag","我终于拥有一台"+smallCar.getWheels()+","+
smallCar.getCarShell()+","+smallCar.getChassis()+"的小轿车啦~");
}
}
题外话
到这里,相信你也可以对建造者模式进行应用了,如果需要很长娴熟当然需要大量的时间与练习,因为建造者模式的变化形式多样,如果只是对单一种类的对象进行建造者模式应用,那么不需要进行构造,可自行去尝试。