构造模式(Builder)
1. 构造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
(同样的构造过程其实就是指很多个不同的构造者有相同的构造方法。)
2. 优点:使得构造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如果要改变一个产品的内部表示,只需要再定义一个具体的构造者即可。
3.解决的问题:
主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。
4. 构造者模式的角色:
- 产品(Product)角色:整个构造模式的产物;
- 抽象构造器(Builder)角色:
- 具体构造器(ConcreteBuilder)角色:具体的构造器实现,是整个构造模式的核心,其中封装了一个目标的对象实例;
- 指挥者(Director)角色:调用各种具体的构造器完成对象构建。
实例代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace BuildPatten 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 Director d = new Director(); 12 Builder b1 = new ConcreteBuliderA(); 13 Builder b2 = new ConcreteBuliderB(); 14 15 d.Construct(b1); 16 product p= b1.GetResult(); 17 p.Show(); 18 19 d.Construct(b2); 20 product p2= b2.GetResult(); 21 p2.Show(); 22 23 Console.ReadLine(); 24 } 25 } 26 27 public class product 28 { 29 private IList<string> parts = new List<string>(); 30 31 public void Add(string part) 32 { 33 parts.Add(part); 34 } 35 36 public void Show() 37 { 38 Console.WriteLine("开始创建产品:"); 39 foreach (string part in parts) 40 { 41 Console.WriteLine("部件" + part); 42 } 43 Console.WriteLine("产品创建完成"); 44 } 45 } 46 47 public abstract class Builder 48 { 49 public abstract void BuildPartA(); 50 public abstract void BuildPartB(); 51 public abstract product GetResult(); 52 } 53 54 public class ConcreteBuliderA : Builder 55 { 56 product product = new product(); 57 public override void BuildPartA() 58 { 59 product.Add("A1"); 60 } 61 62 public override void BuildPartB() 63 { 64 product.Add("B1"); 65 } 66 67 public override product GetResult() 68 { 69 return product; 70 } 71 } 72 73 public class ConcreteBuliderB : Builder 74 { 75 product product = new product(); 76 public override void BuildPartA() 77 { 78 product.Add("A2"); 79 } 80 81 public override void BuildPartB() 82 { 83 product.Add("B2"); 84 } 85 86 public override product GetResult() 87 { 88 return product; 89 } 90 } 91 92 public class Director 93 { 94 public void Construct(Builder builder) 95 { 96 builder.BuildPartA(); 97 builder.BuildPartB(); 98 } 99 } 100 101 }

浙公网安备 33010602011771号