2010年9月28日

设计模式-创造者模式


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




简述


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


功能


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


何处使用


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


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


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


设计


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


Builder


实现


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



01using System;
02using System.Collections;
03 
04public class BuilderPattern
05{
06    static void Main()
07    {
08        Console.Write("Hello");
09        Client client = new Client();
10        Builder b1 = new ConcreteBuilder1();
11        Builder b2 = new ConcreteBuilder2();
12 
13        client.Construct(b1);
14        Product p1 = b1.GetResult();
15        p1.Show();
16        client.Construct(b2);
17        Product p2 = b2.GetResult();
18        p2.Show();
19    }
20}
21 
22public class Client
23{
24    public void Construct(Builder builder)
25    {
26        builder.BuildPartA();
27        builder.BuildPartB();
28    }
29}
30 
31public abstract class Builder
32{
33    public abstract void BuildPartA();
34    public abstract void BuildPartB();
35    public abstract Product GetResult();
36}
37 
38public class ConcreteBuilder1 : Builder
39{
40    private Product product = new Product();
41    public override void BuildPartA()
42    {
43        product.Add("PartA");
44    }
45    public override void BuildPartB()
46    {
47        product.Add("PartB");
48    }
49    public override Product GetResult()
50    {
51        return product;
52    }
53}
54 
55public class ConcreteBuilder2 : Builder
56{
57    private Product product = new Product();
58    public override void BuildPartA()
59    {
60        product.Add("PartX");
61    }
62    public override void BuildPartB()
63    {
64        product.Add("PartY");
65    }
66    public override Product GetResult()
67    {
68        return product;
69    }
70}
71 
72public class Product
73{
74    ArrayList parts = new ArrayList();
75    public void Add(string part)
76    {
77        parts.Add(part);
78    }
79    public void Show()
80    {
81        Console.WriteLine("\nProduct Parts -------");
82        foreach (string part in parts)
83        Console.WriteLine(part);
84    }
85}


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


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


没有评论:

发表评论