设计模式-创造者模式(Builder)

创造者模式是一种用于解耦对象创建的设计模式,适用于需要创建复杂对象的场景。本文通过快餐店套餐搭配的例子,详细介绍了创造者模式的功能、使用场景及其设计与实现。

 

简述

  创造者模式在软件开发中也是一个很常用的设计模式,当遇到复杂的对象需要创建时它给我们带来极大的方便。创造者模式属于解耦对象创建的创建型模式

功能

  将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。这句话是 Baidu 到了,感觉它能非常准确的形容创造者模式的功能。

何处使用

  当我们需要创建一个对象时,它是由不同部件组合而成,并且通过不同的组合可以产生符合不同场合的对象时,此时就可以使用创造者模式。在适合的场合使用它对代码的扩展性维护性带来很大好处。

  我们去吃快餐时经常会有服务员介绍套餐,这是一个非常好的例子,我在很多介绍创造者模式的文章中看到这样的例子。餐厅的食物有很多,经过不同的组合后可以符合不同客户的口味,我常常去永和大王点卤肉饭套餐,套餐内容是卤肉饭+鸳鸯豆浆,或许这个例子不太能看出其中的奥秘,我们将这个套餐丰富一下,卤肉饭+鸳鸯豆浆+棒棒鸡(如果真这样就好了!)我们暂且叫它套餐 A,这是我喜欢的组合,当然我的朋友可能口味清淡些,他点的是鸡排饭+果汁+蔬菜沙拉我们叫它套餐 B 吧,我们在同样的餐厅里面都吃到了自己喜欢的东西。

  如此看来,他们只是做了组合的工作,我选择 A 套餐,他们按照 A 套餐的菜单来配菜,然而这些东西并不是由客人随意说出来的,都是他们餐厅存在的东西,所以可以做到符合各位客人的口味并且能够快速响应客人需求的服务。当有新的搭配时只需要新安排 E 套餐的菜单就可以。我们完全可以把创建者模式看作是一个按照套餐菜单配菜的配菜师傅,然而这些菜是如何制作的他不用担心,厨师们在厨房会给他提供。看来这样的工作模式也是非常符合现在的市场需求,快捷而又人性化的服务。

设计

  通过上面的例子,我们可以规划下餐厅的工作模式,餐厅需要一个厨房里面有很多厨师可以做出所有提供的,然后是必不可少的是配菜师傅,他的任务就是按照客人给的菜单配成不同的套餐,看来他在厨师和客人之间起着很重要的作用。接下来看 UML 图,我们用产品和创造者来为例子:

Builder

实现

  知道餐厅到底如何规划了,当然最重要的是 Do it,接下来可以把我们的需求和设计真正实现,多么令人兴奋的时刻:

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

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

using System;

using System.Collections;

 

public class BuilderPattern

{

    static void Main()

    {

        Console.Write("Hello");

        Client client = new Client();

        Builder b1 = new ConcreteBuilder1();

        Builder b2 = new ConcreteBuilder2();

 

        client.Construct(b1);

        Product p1 = b1.GetResult();

        p1.Show();

        client.Construct(b2);

        Product p2 = b2.GetResult();

        p2.Show();

    }

}

 

public class Client

{

    public void Construct(Builder builder)

    {

        builder.BuildPartA();

        builder.BuildPartB();

    }

}

 

public abstract class Builder

{

    public abstract void BuildPartA();

    public abstract void BuildPartB();

    public abstract Product GetResult();

}

 

public class ConcreteBuilder1 : Builder

{

    private Product product = new Product();

    public override void BuildPartA()

    {

        product.Add("PartA");

    }

    public override void BuildPartB()

    {

        product.Add("PartB");

    }

    public override Product GetResult()

    {

        return product;

    }

}

 

public class ConcreteBuilder2 : Builder

{

    private Product product = new Product();

    public override void BuildPartA()

    {

        product.Add("PartX");

    }

    public override void BuildPartB()

    {

        product.Add("PartY");

    }

    public override Product GetResult()

    {

        return product;

    }

}

 

public class Product

{

    ArrayList parts = new ArrayList();

    public void Add(string part)

    {

        parts.Add(part);

    }

    public void Show()

    {

        Console.WriteLine("\nProduct Parts -------");

        foreach (string part in parts)

        Console.WriteLine(part);

    }

}

  当然这段代码只是起到示意的作用,从中可以看出创造者模式需要做到以下两点:

  1. 符合客户需要的产品,此类产品的创建过程应该是差不多的;
  2. 一个或者多个搭配产品的配餐员

转载于:https://my.oschina.net/zhangguangxi/blog/1560962

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值