现在的位置: 首页 > 综合 > 正文

<九>读<<大话设计模式>>之建造者模式

2018年05月24日 ⁄ 综合 ⁄ 共 2351字 ⁄ 字号 评论关闭

         学习了这么多模式,其实回想一下其实也没什么,就是用不同的方式设计代码,保证代码的可扩展性、复用等,稍微对代码进行一下修改就是另外一种模式。在我们工作中其实已经用了很多模式了,只不过不知道或者没留意他叫什么而已,无所谓,只要会用一切都是浮云。

         关于<<大话设计模式>>对建造者模式的讲解是以画一个人来作为例子讲解的。人分为高人、矮人、胖人、瘦人等,但都是人,但当你去画一个人的时候,画的过程都是稳定的,都需要画头、身子、手、脚,不同的是建造的细节是不一样的。所以如果你需要将一个复杂的构件与它的表示分离,使得同样的过程可以建造不同的表示,这样的模式就是建造者模式。

好了,我们通过分析代码来解释抽象吧。

1、产品类(也就是例子中的人)、有多个部件组成

public
class
Product {

 

    private List<String>
list = new ArrayList<String>();

    //相当于给人画头、手、脚

    public
void
add(String str){

       list.add(str);

    }

   

    public
void
show(){

       for(String string :
list){

           System.out.print(string+",");

       }

    }

}

2、建造者,确定产品有A和B组成

public
abstract
class
Builder {

 

    public
abstract
void
buildPartA();

    public
abstract
void
buildPartB();

    public
abstract
Product getResult();

}

3、部件1

public
class
Build1 extends Builder {

 

    Productproduct =
new Product();

    @Override

    public
void
buildPartA() {

       // TODO Auto-generated method stub

 

       product.add("built part a1");

    }

 

    @Override

    public
void
buildPartB() {

       // TODO Auto-generated method stub

 

       product.add("built part b1");

    }

 

    @Override

    public Product getResult() {

       // TODO Auto-generated method stub

       return
product;

    }

 

}

4、部件2

public
class
Build2 extends Builder {

 

    Productproduct = new Product();

    @Override

    public
void
buildPartA() {

       // TODO Auto-generated method stub

 

       product.add("built part a2");

    }

 

    @Override

    public
void
buildPartB() {

       // TODO Auto-generated method stub

 

       product.add("built part b2");

    }

 

    @Override

    public Product getResult() {

       // TODO Auto-generated method stub

       return
product;

    }

 

}

5、指挥者类(关键,传什么对象建什么对象)

/*

 * 指挥者,传递那个对象建造那个对象

 */

public
class
Director {

 

    public
void
construct(Builder builder){

       //都要建A和B,只不过建的内容不一样而已

builder.buildPartA();

       builder.buildPartB();

    }

}

6、客户端

public
class
BuildClient {

 

    /**

     * @param args

     */

    public
static
void
main(String[] args) {

       // TODO Auto-generated method stub

 

       //建造A对象

       Builderbuilder = new Build1();

       Directordirector = new Director();

       director.construct(builder);

       Productproduct =builder.getResult();

       product.show();

      

       Builderbuilder2 = new Build2();

       director.construct(builder2);

       product =builder2.getResult();

       product.show();

    }

 

}

       当我们再增加一个部件的时候我们只需要增加一个部件类并继承Build就可以了,直接在客户端实例化调用即可,因为增加的部件类也有A和B两部分,公共的东西是不变的。

附上建造者模式结构图

总结:建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时使用的模式。建造者模式就是将公共的必须的过程抽出来,保证每次创建都会执行公共的过程,只是具体细节不一样,就像画人一样,都需要画头、手、脚。

抱歉!评论已关闭.