博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-创造者模式(Builder)
阅读量:7224 次
发布时间:2019-06-29

本文共 2655 字,大约阅读时间需要 8 分钟。

hot3.png

 

简述

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

功能

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

何处使用

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

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

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

设计

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

实现

  知道餐厅到底如何规划了,当然最重要的是 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

你可能感兴趣的文章
PHP——字符串统一转码为GBK,自动判断是否UTF8并转码
查看>>
LeetCode-Max Points on a Line[AC源码]
查看>>
广度优先算法Java实现以及最短路径搜索
查看>>
Insert Into select 与 Select Into 哪个更快?
查看>>
vue-cli子组件完成操作后通知父组件
查看>>
solr导入数据库数据
查看>>
JDK和JRE的区别
查看>>
Struts2笔记——自定义拦截器
查看>>
Dotnetnuke 6 设置安装
查看>>
20155229 《信息安全系统设计基础》第六周作业补充
查看>>
oracle分页存储过程
查看>>
javacript中的事件
查看>>
java 多线程四
查看>>
Django开发笔记五
查看>>
2014年acm区域赛牡丹江赛区总结
查看>>
【转载】关于前后端分离式开发学习
查看>>
忙里偷闲( ˇˍˇ )闲里偷学【C语言篇】——(9)链表
查看>>
struts2 type="redirectAction"重定向 与动态调用方法
查看>>
实时搜索的优化
查看>>
Oracle 好书 07 ( undo 表空间管理 )
查看>>