首页 > 代码库 > 设计模式05-建造者模式

设计模式05-建造者模式

1. 概念 

       将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 .

       适用性:

       1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

         2.当构造过程必须允许被构造的对象有不同的表示时。

       参与者:

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

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

                  3.Director 构造一个使用Builder接口的对象。

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

 

2. 网络案例

        

package org.demo.builder;
/**  * Function :  * @author : Liaokailin * CreateDate : 2014-2-27 * version : 1.0 *//* Director*/ class PersonDirector{     public Person constructPerson(PersonBuilder pb){         pb.buildBody() ;         pb.buildHead() ;         pb.buildFoot() ;         return pb.buildPerson() ;     }    }/* Builder  */interface PersonBuilder{    void buildHead() ;    void buildBody() ;    void buildFoot() ;    Person buildPerson() ;}/* ConcreteBuilder */class  ManBuilder implements PersonBuilder{    Person person ;    public ManBuilder(){        person  = new Person() ;    }    public void buildHead() {        person.setHead("创建男人的头");    }    public void buildBody() {        person.setBody("创建男人的身体") ;    }    public void buildFoot() {        person.setFoot("创建男人的脚") ;    }    public Person buildPerson() {        return person;    }    } /*product  表示被构造的复杂对象*/class Person{    private String head ;    private String body ;    private String foot ;    public String getHead() {        return head;    }    public void setHead(String head) {        this.head = head;    }    public String getBody() {        return body;    }    public void setBody(String body) {        this.body = body;    }    public String getFoot() {        return foot;    }    public void setFoot(String foot) {        this.foot = foot;    }        }public class Main {      public static void main(String args[]){        PersonDirector pd = new PersonDirector() ;        Person person = pd.constructPerson(new ManBuilder()) ;        System.out.println(person.getBody());         System.out.println(person.getFoot());        System.out.println(person.getHead());            }    }

 

 运行结果:

 

创建男人的身体创建男人的脚创建男人的头

 

 

3. 个人编写案例

      

package org.demo.builder;/** *  * Function : 建造者设计模式 *  将对象复杂的构造过程和最终的表示相分离   使得同样的构造过程可以创建不同的表示 * @author : Liaokailin * CreateDate : 2014-6-20 * version : 1.0 */public class BuilderFoo {                public static void main(String[] args) {        System.out.println(" 经销商给客户进行的汽车保养(汽车在三包期内)费用应该由汽车厂承担  故经销商通过系统向车厂申请索赔  ==>创建索赔单");                BuilderOrder createOrder = new CreateClaimOrderFromJSP() ;        ClaimOrder claimOrder = new ClaimOrderOtbainDirector(createOrder).obtainClaimOrder() ;        System.out.println("向数据库保存索赔单信息  经销商新增索赔单成功. 索赔单信息为:");        System.out.println("\t\t"+claimOrder.toString());                System.out.println("--------------经销商提交索赔单以后 车厂需要审核索赔单 ,点击审核以后需要去查询索赔单信息---------------");                createOrder = new ViewClaimOrderFromDB() ;        claimOrder = new ClaimOrderOtbainDirector(createOrder).obtainClaimOrder() ;              System.out.println("查询索赔单详情:\n"+claimOrder.toString());                    }        }/** * 需要构建的对象  ==>汽车4S店 (经销商) 向汽车厂索赔申请的索赔单 */class ClaimOrder{     String baseInfo  ; //基本信息      String partsInfo ; //配件信息     String claimPrice ; //索赔金额     String attachInfo ; //附件信息         @Override    public String toString() {        return "ClaimOrder [baseInfo=" + baseInfo + ", partsInfo=" + partsInfo                + ", claimPrice=" + claimPrice + ", attachInfo=" + attachInfo                + "]";    }    public String getBaseInfo() {        return baseInfo;    }    public void setBaseInfo(String baseInfo) {        this.baseInfo = baseInfo;    }    public String getPartsInfo() {        return partsInfo;    }    public void setPartsInfo(String partsInfo) {        this.partsInfo = partsInfo;    }    public String getClaimPrice() {        return claimPrice;    }    public void setClaimPrice(String claimPrice) {        this.claimPrice = claimPrice;    }    public String getAttachInfo() {        return attachInfo;    }    public void setAttachInfo(String attachInfo) {        this.attachInfo = attachInfo;    }     }/** *  * 创建一个索赔订单的过程 */interface BuilderOrder {         void baseInfo()  ; //基本信息          void partsInfo() ; //配件信息         void claimPrice() ; //索赔金额         void attachInfo() ; // 附件信息         ClaimOrder obtainClaimOrder() ;  //创建索赔单}/** *  * 从jsp页面获取信息 新增的方式创建索赔单 */class CreateClaimOrderFromJSP implements BuilderOrder{    ClaimOrder claimOrder ;    public CreateClaimOrderFromJSP() {        claimOrder = new ClaimOrder() ;    }    @Override    public void baseInfo() {        System.out.println("\t从jsp页面获取baseinfo");        claimOrder.setBaseInfo("baseInfo") ;    }    @Override    public void partsInfo() {        System.out.println("\t从jsp页面获取配件信息");        claimOrder.setPartsInfo("partsInfo") ;    }    @Override    public void claimPrice() {        System.out.println("\t从jsp页面获取索赔总金额.");        claimOrder.setClaimPrice("总金额:10000") ;    }     @Override    public void attachInfo() {        System.out.println("\t上传附件到文件服务器,然后将文件id返回");        claimOrder.setAttachInfo("附件IDS.") ;            }    @Override    public ClaimOrder obtainClaimOrder() {        return claimOrder;    }    }//  例外的实现一个   class Xxx implements BuilderOrder   可以自由获得一个新的索赔单的处理过程    例如 点击页面上的  【索赔单详情】 是需要从数据库检索信息/** * 从数据库来查询索赔单信息 */class ViewClaimOrderFromDB implements BuilderOrder{    ClaimOrder claimOrder ;    public ViewClaimOrderFromDB() {        claimOrder = new ClaimOrder() ;    }    @Override    public void baseInfo() {        System.out.println("\t从数据库获取baseinfo");        claimOrder.setBaseInfo("baseInfo from db") ;    }    @Override    public void partsInfo() {        System.out.println("\t从数据库获取配件信息");        claimOrder.setPartsInfo("partsInfo from db ") ;    }    @Override    public void claimPrice() {        System.out.println("\t从数据库获取索赔总金额.");        claimOrder.setClaimPrice("总金额:10000  from db ") ;    }     @Override    public void attachInfo() {        System.out.println("\t从数据库将文件id返回");        claimOrder.setAttachInfo("附件IDS FROM DB  ") ;            }    @Override    public ClaimOrder obtainClaimOrder() {        return claimOrder;    }}/** * 创建索赔单.  构造过程都是一样的  只要BuilderOrder的方式不同 最后获得的信息是不一样的 */class ClaimOrderOtbainDirector{    private BuilderOrder cbo  ;    public ClaimOrderOtbainDirector(BuilderOrder cbo) {        this.cbo = cbo ;    }        public ClaimOrder obtainClaimOrder(){        //先处理基础信息        cbo.baseInfo() ;        cbo.partsInfo() ;        cbo.claimPrice() ;        cbo.attachInfo() ;        return cbo.obtainClaimOrder() ;    }}

 

    执行的结果:

  

 经销商给客户进行的汽车保养(汽车在三包期内)费用应该由汽车厂承担  故经销商通过系统向车厂申请索赔  ==>创建索赔单    从jsp页面获取baseinfo    从jsp页面获取配件信息    从jsp页面获取索赔总金额.    上传附件到文件服务器,然后将文件id返回向数据库保存索赔单信息  经销商新增索赔单成功. 索赔单信息为:        ClaimOrder [baseInfo=baseInfo, partsInfo=partsInfo, claimPrice=总金额:10000, attachInfo=附件IDS.]--------------经销商提交索赔单以后 车厂需要审核索赔单 ,点击审核以后需要去查询索赔单信息---------------    从数据库获取baseinfo    从数据库获取配件信息    从数据库获取索赔总金额.    从数据库将文件id返回查询索赔单详情:ClaimOrder [baseInfo=baseInfo from db, partsInfo=partsInfo from db , claimPrice=总金额:10000  from db , attachInfo=附件IDS FROM DB  ]