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

设计模式-builder(构造器模式)

2015-01-19 15:46 381 查看

设计模式-builder(构造器模式)




Bilder模式定义:

        将一个复杂对象的构建和表示分离,是同样的创建构建过程可以创造不同的表示。
 
     Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用用不知道内部的具体构建细节。Builder模式是非常类似抽象工厂模式,细微的区别大概只是在反复使用中才能体会到。


为何使用建造者模式

     是为了将复杂对象的构建过程与它的部件分离。注意: 是解耦过程和部件。

    因为一个复杂的对象,不但有很多大量组成部分。例如汽车,有很多部件:车轮、方向盘、发动机,还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配过程也很复杂(需要很好的组装技术),Builder模式就是为了将部件和组装过程分开。


建造者模式典型结构图




如何使用建造者模式

     首先假设一个复杂对象是由多个部件组成的,Builder模式是吧复杂对象的创建和部件的创建分开来,分别用Director和Builder类来表示。

如果需要一个接口来创建部件:

[java]
view plaincopy

package com.designpatten.builder;  
  
  
public interface Builder {  
    void buildCarWheel() ;  
    void buildSteeringWheel() ;  
    void buildEngine() ;  
    void buildCarFrame() ;  
    Car getCar() ;  
}  

在Director中构建复杂对象,将Builder中定义的一个一个部件组装起来。

[java]
view plaincopy

package com.designpatten.builder;  
  
public class Director {  
  
    private Builder builder ;  
      
    public Director(Builder builder){  
        this.builder = builder ;  
    }  
      
    public void getCarTogether(){  
        builder.buildCarFrame() ;  
        builder.buildEngine();  
        builder.buildCarWheel() ;  
        builder.buildSteeringWheel() ;  
    }  
      
}  

实现具体的Builder:
通过实现接口,来完成部件的构建过程
重新获得目标对象接口

[java]
view plaincopy

package com.designpatten.builder;  
  
public class BenzBuilder implements Builder {  
  
    private Benz benz ;  
      
    public BenzBuilder(){  
        benz = new Benz() ;  
    }  
      
    @Override  
    public void buildCarWheel() {  
        System.out.println("Benz add Wheel");  
    }  
  
    @Override  
    public void buildSteeringWheel() {  
        System.out.println("Benz add SteeringWheel");  
    }  
  
    @Override  
    public void buildEngine() {  
        System.out.println("Benz add engine");  
    }  
  
    @Override  
    public void buildCarFrame() {  
        System.out.println("Benz add frame");  
    }  
  
    @Override  
    public Car getCar() {  
        return benz;  
    }  
  
}  

[java]
view plaincopy

package com.designpatten.builder;  
  
  
public class BMWBuilder implements Builder {  
  
  
    private BMW bmw ;   
      
    public BMWBuilder(){  
        bmw = new BMW() ;  
    }  
      
    @Override  
    public void buildCarWheel() {  
        System.out.println("BMW add CarWheel");  
    }  
  
  
    @Override  
    public void buildSteeringWheel() {  
        System.out.println("BMW add SteeringWheel");  
    }  
  
  
    @Override  
    public void buildEngine() {  
        System.out.println("BMW add Engine");  
    }  
  
  
    @Override  
    public void buildCarFrame() {  
        System.out.println("BMW add Frame");  
    }  
  
  
    @Override  
    public Car getCar() {  
        return bmw;  
    }  
  
  
}  

具体的产品信息

[java]
view plaincopy

package com.designpatten.builder;  
  
public interface Car {  
      
    void run() ;  
      
}  

[java]
view plaincopy

package com.designpatten.builder;  
  
public class BMW implements Car {  
  
    @Override  
    public void run() {  
        System.out.println("BMW ---> run()");  
    }  
  
}  

[java]
view plaincopy

package com.designpatten.builder;  
  
public class Benz implements Car {  
  
    @Override  
    public void run() {  
        System.out.println("Benz -------> run()");  
    }  
  
}  

生产Car

[java]
view plaincopy

package com.designpatten.builder;  
  
public class Client {  
    public static void main(String[] args) {  
        BenzBuilder benzBuilder = new BenzBuilder() ;  
        BMWBuilder bmwBuilder = new BMWBuilder() ;  
          
        Director benzDirector = new Director(benzBuilder) ;  
        benzDirector.getCarTogether() ;  
        Car benz = benzBuilder.getCar() ;  
        benz.run() ;  
        System.out.println("----------------------------");  
        Director bmwDirector = new Director(bmwBuilder) ;  
        bmwDirector.getCarTogether() ;  
        Car bmw = bmwBuilder.getCar() ;  
        bmw.run() ;  
    }  
}  

输出结构

[java]
view plaincopy

Benz add frame  
Benz add engine  
Benz add Wheel  
Benz add SteeringWheel  
Benz -------> run()  
----------------------------  
BMW add Frame  
BMW add Engine  
BMW add CarWheel  
BMW add SteeringWheel  
BMW ---> run()  

参考:http://www.weixueyuan.net/view/6110.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息