设计模式–建造者模式
建造者模式定义:
将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
建造者模式包括的角色:
- Builder:给出一个抽象接口或抽象类,以规范产品的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建,一般由子类具体实现。
- ConcreteBuilder:Builder接口的实现类,并返回组建好对象实例
- Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建
- Product:要创建的复杂对象,产品类
建造者模式的使用场景:
- 当产品由复杂的内部构造时(参数很多)
- 需要生产的产品的属性相互依赖,这些属性的赋值顺序比较重要时(因为在调用ConcreteBuilder的赋值方法时是有先后顺序的)
举例:组装一台电脑
产品类:假设一个computer类有三个部件:cpu,主板以及内存
1
2
3
4
5
6
7
8
9
10
11
12
13
14public class Computer{
private String mCpu;
private String mMainboard;
private String mRam;
public void setmCpu(String mCpu){
this.mCpu = mCpu;
}
public void setmMainboard(String mMainboard){
this.mMainboard = mMainboard;
}
public void setmRam(String mRam){
this.mRam = mRam;
}
}Builder类:提供安装cpu,主板,内存的抽象方法,以及组装电脑的create方法
1
2
3
4
5
6public abstract class Builder{
public abstract void buildCpu(String cpu);
public abstract void buildMainboard(String mianboard);
public abstract void buildRam(String ram);
public abstract Computer create();
}Builder实现类:里面不仅新建了Computer的实例,还提供了安装CPU,主板和内存的具体实现方法,并且在组装电脑的create方法中将该Computer对象实例返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class MyComputerBuilder extends Builder{
private Computer mComputer = new Computer();
@Override
public void buildCpu(String cpu){
mComputer.setmCpu(cpu);
}
@Override
public void buildMainboard(String mainboard){
mComputer.setmMianboard(mainboard);
}
@Override
public void buildRam(String ram){
mComputer.setmRam(ram);
}
@Override
public Computer create(){
return mComputer;
}
}Director类:用来规范组装电脑的流程顺序,先安装主板,再安装CPU,最后安装内存并组装成电脑。
1
2
3
4
5
6
7
8
9
10
11
12
13public class Director{
Builder mBuild = null;
public Director(Builder build){
this.mBuild = build;
}
public Computer CreateComputer(String cpu,String mainboard,String ram){
//规范建造流程
this.mBuild.buildMainboard(mainboard);
this.mBuild.buildCpu(cpu);
this.mBuild.buildRam(ram);
return mBuild.create();
}
}使用
1
2
3Builder mBuilder = new MyComputerBuilder();
Director mDirector = new Director(mBuilder);
mDirector.CreateComputer("i7","Intel主板","8G");//返回Computer实例对象