场景:
[西安航天技师学院]实训中心某工件的加工过程,有两道主要工序,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 模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。