建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
介绍
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例: 1、JAVA 中的 StringBuilder;2、EventBus对象的创建。
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
框架
在建造者模式中有四个成员:
- Director:与用户直接交互,掌控Build的顺序,调用Builder中创建对象的方法;
- Builder:各对象创建的方法类,实现ConcreteBuilder接口中定义的创建方法;
- ConcreteBuilder:对象创建接口,将产品各部件的创建方法抽象到接口中;
- Product:产品类,即最终要build的生成物。
实例
接下来通过一个实例来演示建造者模式的工作方法,该实例通过建造者模式创建一个完整的IPhone对象:
1、定义产品类 IPhone
IPhone中有Screen、MainBroad、CPU、Camera四个零件(此处简化都为String对象,在复杂情况下每个部件都应该是一个类,并且有自己的创建方法和顺序)。
/**
* Created by wise on 2018/6/14.
*/
public class IPhone {
private String mScreen;
private String mMainBroad;
private String mCPU;
private String mCamera;
public String getScreen() {
return mScreen;
}
public void setScreen(String screen) {
mScreen = screen;
}
public String getMainBroad() {
return mMainBroad;
}
public void setMainBroad(String mainBroad) {
mMainBroad = mainBroad;
}
public String getCPU() {
return mCPU;
}
public void setCPU(String CPU) {
mCPU = CPU;
}
public String getCamera() {
return mCamera;
}
public void setCamera(String camera) {
mCamera = camera;
}
}
2、抽象IPhoneBuild接口(ConcreteBuilder角色)
IPhoneBuild中把建造IPhone的过程抽象为接口,共有5个方法,分别是各模块的建造方法和最后生成物的建造方法。
/**
* Created by wise on 2018/6/14.
*/
public interface IPhoneBuild {
public void buildScreen();
public void buildMainBroad();
public void buildCPU();
public void buildCamera();
public IPhone buildIPhone();
}
3、IPhoneBuild接口实现(Builder角色)
然后在IPhoneBuilder中对上述接口进行具体实现,各模块和生成物的详细建造逻辑在这里实现,此处扮演Builder的角色。
/**
* Created by wise on 2018/6/14.
*/
public class IPhoneBuilder implements IPhoneBuild {
private IPhone mIPhone;
public IPhoneBuilder() {
mIPhone = new IPhone();
}
@Override
public void buildScreen() {
Log.d("build","Screen has been build");
mIPhone.setScreen("OLED");
}
@Override
public void buildMainBroad() {
Log.d("build","MainBroad has been build");
mIPhone.setMainBroad("Samsung");
}
@Override
public void buildCPU() {
Log.d("build","CPU has been build");
mIPhone.setCPU("Snapdragon");
}
@Override
public void buildCamera() {
Log.d("build","Camera has been build");
mIPhone.setCamera("Sony");
}
@Override
public IPhone buildIPhone() {
return mIPhone;
}
}
4、IPhoneDirect(Director角色)
IPhoneDirect为直接与用户交互的类,此处调用了各模块的建造方法,并且在这里控制模块建造与否、顺序逻辑,并最终组装成生成物返回给用户。
/**
* Created by wise on 2018/6/14.
*/
public class IPhoneDirect {
private IPhoneBuilder mIPhoneBuilder;
public IPhoneDirect(IPhoneBuilder iPhoneBuilder){
mIPhoneBuilder = iPhoneBuilder;
}
public IPhone build(){
mIPhoneBuilder.buildCamera();
mIPhoneBuilder.buildCPU();
mIPhoneBuilder.buildMainBroad();
mIPhoneBuilder.buildScreen();
return mIPhoneBuilder.buildIPhone();
}
}
5、实例调用
此处演示在Activity中通过Direct对象完成一个IPhone对象的创建过程,在实际应用中上述的每一环节都要比此Demo中所写的要复杂很多,尤其是每个模块的建造过程和最终在Director中建造、组装的顺序是Build模式最独特和关键的特点。
public class BuildActivity extends AppCompatActivity {
private IPhone myIPhone;
private IPhoneDirect mIPhoneDirect;
private TextView tv_ShowInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_build);
tv_ShowInfo = (TextView) findViewById(R.id.tv_showInfo);
mIPhoneDirect = new IPhoneDirect(new IPhoneBuilder());
myIPhone = mIPhoneDirect.build();
tv_ShowInfo.setText(myIPhone.getCamera() + "," + myIPhone.getCPU() + "," + myIPhone.getMainBroad() + "," + myIPhone.getScreen());
}
}