设计模式-建造者模式(Builder)
2016-04-13 10:55
639 查看
建造者模式(Builder),又叫生成器模式,将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式可以将一个产品的内部表象和产品的生成过程分割开来,从而可以是一个建造过程可以生成具有不同内部表象的产品对象。如果我们使用了建造者模式,你们用户就只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。
![](https://img-blog.csdn.net/20160413094420361?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Builder是为创建一个产品对象的各个部件指定的抽象接口。
ConcreteBuilder是具体的创建者,实现Builder接口,构造和装配各个部件。
Product是具体产品角色。
Director是指挥者,它是构建一个使用Builder接口的对象。
什么时候会使用建造者模式呢?它主要用于创建一些复杂的对象,这些对象内部构建间的创建顺序通常是稳定的,但对象内部的构建通常面临复杂的变化。建造者模式的好处就是使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了。
建造者模式的基本代码:
package builder.demo;
产品类:
import java.util.ArrayList;
public class Product {
ArrayList<String> parts = new ArrayList<String>();
//添加产品部件
public void add(String mStr){
parts.add(mStr);
}
//列举产品部件
public void show(){
for(String str : parts){
System.out.println("parts:"+str);
}
}
}
//抽象建造者类,确定产品有2个部件partA,partB组成,声明一个得到产品创建后结果的方法
public abstract class Builder {
public abstract void builderPartA();
public abstract void builderPartB();
public abstract Product getResult();
4000
}
//具体的建造者类
public class ConcreteBuilder1 extends Builder {
private Product mProduct = new Product();
//建造具体的部件
@Override
public void builderPartA() {
mProduct.add("ConcreteBuilder1,部件AAA");
}
@Override
public void builderPartB() {
mProduct.add("ConcreteBuilder1,部件BBB");
}
@Override
public Product getResult() {
return mProduct;
}
}
//具体的建造者类
public class ConcreteBuilder2 extends Builder {
private Product mProduct = new Product();
//建造具体的部件
@Override
public void builderPartA() {
mProduct.add("ConcreteBuilder2,部件XXX");
}
@Override
public void builderPartB() {
mProduct.add("ConcreteBuilder2,部件YYY");
}
@Override
public Product getResult() {
return mProduct;
}
}
//指挥者类
public class Director {
//用来指挥建造过程
public void construct(Builder mBuilder){
mBuilder.builderPartA();
mBuilder.builderPartB();
}
//客户端代码
public static void main(String[] args){
Director mDirector = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
//指挥者用ConcreteBuilder1的方法来创建产品
mDirector.construct(b1);
Product p1 = b1.getResult();
p1.show();
//指挥者用ConcreteBuilder1的方法来创建产品
mDirector.construct(b2);
Product p2 = b2.getResult();
p2.show();
}
}
输出结果:
parts:ConcreteBuilder1,部件AAA
parts:ConcreteBuilder1,部件BBB
parts:ConcreteBuilder2,部件XXX
parts:ConcreteBuilder2,部件YYY
建造者模式可以将一个产品的内部表象和产品的生成过程分割开来,从而可以是一个建造过程可以生成具有不同内部表象的产品对象。如果我们使用了建造者模式,你们用户就只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。
Builder是为创建一个产品对象的各个部件指定的抽象接口。
ConcreteBuilder是具体的创建者,实现Builder接口,构造和装配各个部件。
Product是具体产品角色。
Director是指挥者,它是构建一个使用Builder接口的对象。
什么时候会使用建造者模式呢?它主要用于创建一些复杂的对象,这些对象内部构建间的创建顺序通常是稳定的,但对象内部的构建通常面临复杂的变化。建造者模式的好处就是使得建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要在定义一个具体的建造者就可以了。
建造者模式的基本代码:
package builder.demo;
产品类:
import java.util.ArrayList;
public class Product {
ArrayList<String> parts = new ArrayList<String>();
//添加产品部件
public void add(String mStr){
parts.add(mStr);
}
//列举产品部件
public void show(){
for(String str : parts){
System.out.println("parts:"+str);
}
}
}
//抽象建造者类,确定产品有2个部件partA,partB组成,声明一个得到产品创建后结果的方法
public abstract class Builder {
public abstract void builderPartA();
public abstract void builderPartB();
public abstract Product getResult();
4000
}
//具体的建造者类
public class ConcreteBuilder1 extends Builder {
private Product mProduct = new Product();
//建造具体的部件
@Override
public void builderPartA() {
mProduct.add("ConcreteBuilder1,部件AAA");
}
@Override
public void builderPartB() {
mProduct.add("ConcreteBuilder1,部件BBB");
}
@Override
public Product getResult() {
return mProduct;
}
}
//具体的建造者类
public class ConcreteBuilder2 extends Builder {
private Product mProduct = new Product();
//建造具体的部件
@Override
public void builderPartA() {
mProduct.add("ConcreteBuilder2,部件XXX");
}
@Override
public void builderPartB() {
mProduct.add("ConcreteBuilder2,部件YYY");
}
@Override
public Product getResult() {
return mProduct;
}
}
//指挥者类
public class Director {
//用来指挥建造过程
public void construct(Builder mBuilder){
mBuilder.builderPartA();
mBuilder.builderPartB();
}
//客户端代码
public static void main(String[] args){
Director mDirector = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
//指挥者用ConcreteBuilder1的方法来创建产品
mDirector.construct(b1);
Product p1 = b1.getResult();
p1.show();
//指挥者用ConcreteBuilder1的方法来创建产品
mDirector.construct(b2);
Product p2 = b2.getResult();
p2.show();
}
}
输出结果:
parts:ConcreteBuilder1,部件AAA
parts:ConcreteBuilder1,部件BBB
parts:ConcreteBuilder2,部件XXX
parts:ConcreteBuilder2,部件YYY
相关文章推荐
- DataTables warning : Requested unknown parameter '5' from the data source for row 0
- UE4:GetViewportSize和GSystemResolution
- UITableView的使用
- String,StringBuffer与StringBuilder的区别
- iOS程序开发中设置UITableView的全屏分隔线的方法(不画线)
- Android : TextView 显示特殊样式(SpannableStringBuilder的应用)
- 2016.04.13,英语,《Vocabulary Builder》Unit 13
- UITableViewCell
- validation query
- UITableView的自定义cell
- ios UIAlterController的使用---注意presentViewController函数一定要延时执行
- androidUI(ViewPager禁止滑动)
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
- String和StringBuilder和StringBuffer区别
- easyui 动态渲染
- iOS开发之UITableView详解
- UILabel的总结
- 22个值得收藏的android开源代码-UI篇
- Kendo UI常用示例汇总(五)
- 关于为busybox设置setuid