建造者模式
2016-06-27 18:27
204 查看
建造者模式
何时使用:对每个对象:将一个复杂的构建过程与其具表示细节相分离,使得同样的构建过程可以创建不同的表示。主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
如何解决:对每个Builder:将变(Builder)与不变(Director)分离开,通过参数传递Builder实例进Director。建造者Builder:创建和提供实例,导演Director:管理建造出来的实例的依赖关系。流程:客户端需要创建什么对象实例就创建一个导演类和这个对象的创建者,将创建者传给导演类,导演类会使用创建者来创建具体的产品。使用方法:1、使用多个Builder,即对Builder接口/抽象类进行不同的具体实现(见下面例子)2、对一个Builder,在Director中对构建过程的每个步骤传入不同的参数实现特化/不同的构建调用顺序(Android中的AlertDialog.Builder)
优点:1、建造者独立,易扩展。2、便于控制细节风险。
缺点:1、多个Builder:产品必须有共同点,范围有限制。2、如内部变化复杂,会有很多的建造类。
使用场景:1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。2、需要生成的对象内部属性本身相互依赖。3、Android中的AlertDialog.Builder。4、JAVA中的StringBuilder。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
单个Builder
参考来源:http://blog.csdn.net/lovelion/article/details/7426015
多个Builder
http://blog.csdn.net/xingjiarong/article/details/50037099
Android中的AlertDialog.Builder
android中大量的使用对话框组件,它的调用方法就是构建,拼接,表示。
Builder通过setTitle(),setMessage(),setIcon()等方法设置AlertDialog的属性AlertController.AlertParams。然后客户可以从create()中获得带AlertController.AlertParams属性的AlertDialog对象show出去。
这里调用函数dialog()相当于Director。
何时使用:对每个对象:将一个复杂的构建过程与其具表示细节相分离,使得同样的构建过程可以创建不同的表示。主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
如何解决:对每个Builder:将变(Builder)与不变(Director)分离开,通过参数传递Builder实例进Director。建造者Builder:创建和提供实例,导演Director:管理建造出来的实例的依赖关系。流程:客户端需要创建什么对象实例就创建一个导演类和这个对象的创建者,将创建者传给导演类,导演类会使用创建者来创建具体的产品。使用方法:1、使用多个Builder,即对Builder接口/抽象类进行不同的具体实现(见下面例子)2、对一个Builder,在Director中对构建过程的每个步骤传入不同的参数实现特化/不同的构建调用顺序(Android中的AlertDialog.Builder)
优点:1、建造者独立,易扩展。2、便于控制细节风险。
缺点:1、多个Builder:产品必须有共同点,范围有限制。2、如内部变化复杂,会有很多的建造类。
使用场景:1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。2、需要生成的对象内部属性本身相互依赖。3、Android中的AlertDialog.Builder。4、JAVA中的StringBuilder。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
单个Builder
classProduct{
privateStringpartA;//定义部件,部件可以是任意类型,包括值类型和引用类型
privateStringpartB;
privateStringpartC;
}
abstractclassBuilder{
//创建产品对象
protectedProductproduct=newProduct();
publicabstractvoidbuildPartA();
publicabstractvoidbuildPartB();
publicabstractvoidbuildPartC();
//返回产品对象
publicProductgetResult(){
returnproduct;
}
}
classDirector{
privateBuilderbuilder;
publicDirector(Builderbuilder){
this.builder=builder;
}
//管理控制产品构建与组装方法
publicProductconstruct(){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
returnbuilder.getResult();
}
}
……
Builderbuilder=newConcreteBuilder();//可以通过配置文件来存储具体建造者类ConcreteBuilder的类名,使得更换新的建造者时无须修改源代码,系统扩展更为方便
Directordirector=newDirector(builder);
Productproduct=director.construct();
……
参考来源:
多个Builder
Android中的AlertDialog.Builder
android中大量的使用对话框组件,它的调用方法就是构建,拼接,表示。
Builder通过setTitle(),setMessage(),setIcon()等方法设置AlertDialog的属性AlertController.AlertParams。然后客户可以从create()中获得带AlertController.AlertParams属性的AlertDialog对象show出去。
protectedvoiddialog(){
AlertDialog.Builderbuilder=newBuilder(Main.this);
builder.setMessage("确认退出吗?");
builder.setTitle("提示");
builder.setPositiveButton("确认",newOnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
dialog.dismiss();
Main.this.finish();
}
});
builder.setNegativeButton("取消",newOnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,intwhich){
dialog.dismiss();
}
});
builder.create().show();
}
这里调用函数dialog()相当于Director。