好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

深入理解Java设计模式之建造者模式

一、什么是建造者模式

建造者模式也称生成器模式 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(依赖倒转)

产品类 :一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。

抽象建造者 :引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。

建造者 :实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。

指挥类 :负责调用适当的建造者来组建产品,指挥类一般不与产品类发生依赖关系,与指挥类直接交互的是建造者类。一般来说,指挥类被用来封装程序中易变的部分。

二、建造者模式的应用场景

1.创建复杂对象的算法独立于组成对象的部件

2.同一个创建过程需要有不同的内部表象的产品对象

例子 :建房子,不管建什么房子,它们都离不开地基、柱子、层面和墙体这些组成部分,建筑工人就是把这些组成部分一个个建起来,最后连成一体建出一栋栋楼房。

三、建造者模式的优缺点

优点

1.客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

2.每一个具体建造者都独立,因此可以方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。

3.可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

4.增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合[开闭]。

缺点

1.当建造者过多时,会产生很多类,难以维护。

2.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,若产品之间的差异性很大,则不适合使用该模式,因此其使用范围受到一定限制。

3.若产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

四、工厂模式和建造者模式的对比

工厂模式用于处理 如何获取实例对象 问题,建造者模式用于处理如何建造实例对象 问题

建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个[指挥类]的角色。在建造者模式的类图中,假如把这个指挥类看做是最终调用的客户端,那么剩余的部分就可以看作是一个简单的工厂模式了。

与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——指挥类。

也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给指挥类。由指挥类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

五、建造者模式的实现

product 类---产品类,由多个部件组成

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//product类,由多个部件组成

public class product

{

     list<string> parts = new list<string>();

     //添加产品部件

     public void add(string part)

     {

         parts.add(part);

     }

      public void show()

     {

         console.writeline( "\n  创建产品" );

         foreach (var item in parts)

         {

             console.writeline( "item" );

         }

     }

}

builder 类---抽象建造者类,确定产品由两个部件parta和partb组成,并声明一个得到产品建造后结果的方法getresult

?

1

2

3

4

5

6

abstract class builder

{

     public abstract void builderparta();

     public abstract void builderpartb();

     public abstract product getresult();

}

具体建造者类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

//concretebuilder1类---具体建造者类

class concretebuilder1 : builder

{

     private product product = new product();

     //建造具体的两个部件

     public override void builderparta()

     {

         product.add( "部件a" );

     }

      public override void builderpartb()

     {

         product.add( "部件b" );

     }

      public override product getresult()

     {

         return product;

     }

}

//concretebuilder2类---具体建造者类

class concretebuilder2 : builder

{

     private product product = new product();

     //建造具体的两个部件

     public override void builderparta()

     {

         product.add( "部件x" );

     }

      public override void builderpartb()

     {

         product.add( "部件y" );

     }

      public override product getresult()

     {

         return product;

     }

}

director 类---指挥者类

?

1

2

3

4

5

6

7

8

9

class director

{

     public void construct(builder builder)

     {

         //用来指挥建造过程

         builder.builderparta();

         builder.builderpartb();

     }

}

客户端代码 ---客户不需知道具体的建造过程

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

static void main(string[] args)

{

     director director = new director();

     builder b1 = new concretebuilder1();

     builder b2 = new concretebuilder2();

      //指挥者用concretebuilder1方法建造产品

     director.construct(b1);

     product p1 = b1.getresult();

     p1.show();

      //指挥者用concretebuilder2方法建造产品

     director.construct(b2);

     product p2 = b2.getresult();

     p2.show();

      console.read();

}

六、总结

建造者模式的使用场合是当创建复杂对象时,把创建对象成员和装配方法分离出来,放在建造者类中去实现,用户使用该复杂对象时,不用理会它的创建和装配过程,只关心它的表示形式。

其实完全理解这个模式还是要一番思考的,难以搞懂的是指挥者似乎没什么存在的必要,在代码里也没体现它的作用,我们也可以把指挥者的方法放在建造者里面,但为什么没有这样做呢?我想这可能是考虑到单一责任原则,建造者只负责创建对象的各个部分,至于各个部分创建的顺序、装配方法它就不管了。还有就是当顺序要改变时,建造者可以不用改动,改动指挥者就好了,指挥者只有一个,建造者有很多,要改建造者就麻烦了。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

原文链接:https://HdhCmsTestcnblogs测试数据/xuwendong/p/9792646.html

查看更多关于深入理解Java设计模式之建造者模式的详细内容...

  阅读:15次