e媒网络

一切皆可能 e媒网络 http://www.eMay.net

博客园 首页 新随笔 联系 订阅 管理

场景:

[西安航天技师学院]实训中心某工件的加工过程,有两道主要工序,ProcessA,ProcessB。工序的数量及顺序一般情况下是固定的,车间的调度员 ProcessDirector负责调度,本次任务,打算安排三台精度不同的设备 ProductBuilder1、ProductBuilder2、ProductBuilder3 同时工作,完成这种加工任务。三台设备由于精度不同,所作出的产品精度可能也不一样。

任务:

请用C#代码,采用Builder模式近似模拟本次加工过程。

UML类图:

 

 

代码演练:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 
  5 namespace BuilderMode
  6 {
  7     class Program
  8     {
  9         static void Main(string[] args)
 10         {
 11             ProcessDirector processDirector = new ProcessDirector();
 12             Builder b1 = new ProductBuilder1();
 13             Builder b2 = new ProductBuilder2();
 14             Builder b3= new ProductBuilder3();
 15 
 16             processDirector.Construct(b1);
 17             Product p1 = b1.GetResult();
 18             p1.Show();
 19 
 20             processDirector.Construct(b2);
 21             Product p2 = b2.GetResult();
 22             p2.Show();
 23 
 24             processDirector.Construct(b3);
 25             Product p3 = b3.GetResult();
 26             p3.Show();
 27 
 28             Console.Read();
 29         }
 30     }
 31 
 32     class ProcessDirector
 33     {
 34         public void Construct(Builder builder)
 35         {
 36             builder.BuildProcessA();
 37             builder.BuildProcessB();
 38         }
 39     }
 40 
 41     abstract class Builder
 42     {
 43         public abstract void BuildProcessA();
 44         public abstract void BuildProcessB();
 45         public abstract Product GetResult();
 46     }
 47 
 48     class ProductBuilder1 : Builder
 49     {
 50         private Product product = new Product();
 51 
 52         public override void BuildProcessA()
 53         {
 54             product.Add("高精度 工序0101");
 55         }
 56 
 57         public override void BuildProcessB()
 58         {
 59             product.Add("高精度 工序0102");
 60         }
 61 
 62         public override Product GetResult()
 63         {
 64             return product;
 65         }
 66     }
 67 
 68     class ProductBuilder2 : Builder
 69     {
 70         private Product product = new Product();
 71         public override void BuildProcessA()
 72         {
 73             product.Add("中精度 工序0201");
 74         }
 75         public override void BuildProcessB()
 76         {
 77             product.Add("中精度 工序0202");
 78         }
 79         public override Product GetResult()
 80         {
 81             return product;
 82         }
 83     }
 84 
 85     class ProductBuilder3 : Builder
 86     {
 87         private Product product = new Product();
 88         public override void BuildProcessA()
 89         {
 90             product.Add("低精度 工序0301");
 91         }
 92         public override void BuildProcessB()
 93         {
 94             product.Add("低精度 工序0302");
 95         }
 96         public override Product GetResult()
 97         {
 98             return product;
 99         }
100     }
101 
102     class Product
103     {
104         IList<string> processes = new List<string>();
105 
106         public void Add(string process)
107         {
108             processes.Add(process);
109         }
110 
111         public void Show()
112         {
113             Console.WriteLine("\n产品工序创建: ");
114             foreach (string process in processes)
115             {
116                 Console.WriteLine(process);
117             }
118         }
119     }
120 
121 
122 }

深度总结:

Builder设计模式主要是用于创建一些复杂的对象,这些对象内部建造顺序通常是稳定的,但对象内部的具体构建通常面临复杂的变化。此模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者九可以了。即构建过程相同,但是子部件却不相同。或者说创建者模式的重心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用,具体的构造实现可以很方便的扩展和切换,从而可以灵活的组合来构造出不同的产品对象。

创建者模式分成两个很重要的部分:

  • Builder接口,定义了如何构建各个部件,也就是知道每个部件功能如何实现,以及如何将这些部件装配到产品中去;
  • ProcessDirector,ProcessDirector是知道如何组合来构建产品,也就是说ProcessDirector负责整体的构建算法,而且通常是分步骤的来执行。

不管如何变化,Builder模式都存在这么两个部分,一个部分是部件构造装配,另一个部分是整体构建算法。Director负责产品的组装,控制生产过程而Buidler是负责产品的部件生产的。这样就可以达到“部件”和“过程”的解耦。创建者模式使用 在使用创建者模式的时,让客户端创造Director,在Director里面封装整体构建算法,然后让Director去调用Builder,让Builder来封装具体部件的构建功能。

在软件系统中,有时候面临着”一个复杂对象“的创建工作,其通常由各个部分的子对象用一定算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定。如何应对这种变化?如何提供一种”封装机制“来隔离出”复杂对象的各个部分“的变化。将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

要点在于:Builder 模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。

posted on 2022-09-23 16:11  e媒网络技术团队  阅读(24)  评论(0编辑  收藏  举报