您的位置:首页 > 产品设计 > UI/UE

设计模式之builder

2014-03-11 20:31 260 查看
前几天写了一个servlet,是这样的,获得一个消息,然后将消息的拆包,获得一些信息,然后利用这些信息返回4种结果。一开始,我写了各种乱的代码,后来经大神指导,学习了build模式。 生成器模式也称为建造者模式。生成器模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示(GoF)。在软件设计中,有时候面临着一个非常复杂的对象的创建工作。这个复杂的对象通常可以分成几个较小的部分,由各个子对象组合出这个复杂对象的过程相对来说比较稳定,但是子对象的创建过程各不相同并且可能面临变化。根据OOD中的OCP(依赖于抽象,不依赖于实现)原则,应该对这些子对象的创建过程进行变化封装。

    builer模式中主要有两个角色,一个是builder(相当于底层的建筑工人),一个是director(相当于设计师)。builder负责提供构建对象各个部分的功 能以及最后组装对象的功能,而director负责调用builder的功能来创建对象。

    Builder:为创建Product对象的各个部件指定抽象接口。

    ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。

    Director:构造一个使用Builer接口的对象。

   Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,以及将这些部件装配成最终产品的接口。

      来一个栗子吧~

     世界上有各种各样的车子,有的车子四个轮子,有的车子八个轮子,有的车子敞篷,有的车子好几个窗户,我来写一个建造一个有四个轮子的有蓬四个窗户的小轿车。

   
/**
* Created with IntelliJ IDEA.
* User: Administrator
* Date: 14-3-11
* Time: 下午7:48
* To change this template use File | Settings | File Templates.
*/
public class Car{

public int getNumofwheels() {
return numofwheels;
}

public void setNumofwheels() {
this.numofwheels++;
}

public int getNumofwindows() {
return numofwindows;
}

public void setNumofwindows() {
this.numofwindows++;
}

public boolean isIschangpeng() {
return ischangpeng;
}

public void setIschangpeng() {
this.ischangpeng = true;
}

private int numofwheels=0;

private int  numofwindows=0;

private boolean ischangpeng=false;

public Car(){
System.out.println("我在建造一个车子");
}

}


public abstract  class CarBuilder {
public abstract void buildWheels();
public abstract void buildWindows();
public abstract Car getCar();
}


/**
* Created with IntelliJ IDEA.
* User: Administrator
* Date: 14-3-11
* Time: 下午7:53
* To change this template use File | Settings | File Templates.
*/
public class smallCar extends CarBuilder{
Car smallCar;
@Override
public void buildWheels(){
smallCar.setNumofwheels();
smallCar.setNumofwheels();
smallCar.setNumofwheels();
smallCar.setNumofwheels();
}
@Override
public   void buildWindows(){
smallCar.setNumofwindows();
smallCar.setNumofwindows();
smallCar.setNumofwindows();
smallCar.setNumofwindows();
}
@Override
public Car getCar(){
smallCar =new Car();
buildWheels();
buildWindows();
return smallCar;
}
}


public class smallCarDerector {
public static void creatSmallCar(CarBuilder smallCar) {
smallCar.buildWindows();
smallCar.buildWheels();
}
}

public class Test {
public  static void main(String []args){
CarBuilder carBuilder=new smallCar();
Car small=carBuilder.getCar();
smallCarDerector.creatSmallCar( carBuilder);
}
}


优点如下:

1、将一个复杂对象的创建过程封装起来。

2、解耦了组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。--上面对自行车的分析可以很清楚的看出这点。

3、向客户隐藏产品内部的表现。

4、产品的实现可以被替换,因为客户只看到一个抽象的接口。

缺点如下:

1、经常被用来创建组合结构。

用途
1、需要生成的产品对象有复杂的内部结构。
2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

实现要点

1、建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。

2、产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或者此模式应用于产品的生成过程,其最终结果可能差异很大,不大可能提炼出一个抽象产品类。

3、创建者中的创建子部件的接口方法不是抽象方法而是空方法,不进行任何操作,具体的创建者只需要覆盖需要的方法就可以,但是这也不是绝对的,特别是类似文本转换这种情况下,缺省的方法将输入原封不动的输出是合理的缺省操作。

4、前面我们说过的抽象工厂模式(AbtractFactory)解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化,建造者模式常和组合模式(Composite Pattern)结合使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息