一、建造者模式介绍
建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。
建造者模式的优点是:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
二、解决实际问题
主要用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。
三、生活中的例子
建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现。这种模式用于快餐店制作儿童餐。典型的儿童餐包括一个主食,一个辅 食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。无论顾客点的是汉堡,三 名治还是鸡肉,过程都是一样的。柜台的员工直接把主食,辅食和玩具放在一起。这些是放在一个袋子中的。饮料被倒入杯中,放在袋子外边。这些过程在相互竞争 的餐馆中是同样的。
四、建造者模式分析
1.建造者结构图
2.代码
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 建造者模式 8 { 9 public class Product 10 { 11 private IList<string> parts = new List<string>(); 12 13 public void Add(string part) { 14 parts.Add(part); 15 } 16 17 public void Show() { 18 Console.WriteLine("产品开始创建....."); 19 foreach (string part in parts) 20 { 21 Console.WriteLine("部件"+part); 22 } 23 Console.WriteLine("产品完成创建"); 24 } 25 } 26 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 建造者模式 8 { 9 public abstract class Builder 10 { 11 public abstract void BuildPartA(); 12 public abstract void BuildPartB(); 13 public abstract Product GetResult(); 14 } 15 16 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 建造者模式 8 { 9 public class ConcreteBuilder1 : Builder 10 { 11 Product product = new Product(); 12 public override void BuildPartA() 13 { 14 product.Add("A1"); 15 } 16 17 public override void BuildPartB() 18 { 19 product.Add("B1"); 20 } 21 22 public override Product GetResult() 23 { 24 return product; 25 } 26 } 27 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 建造者模式 8 { 9 public class ConcreteBuilder2:Builder 10 { 11 Product product = new Product(); 12 public override void BuildPartA() 13 { 14 product.Add("A2"); 15 } 16 17 public override void BuildPartB() 18 { 19 product.Add("B2"); 20 } 21 22 public override Product GetResult() 23 { 24 return product; 25 } 26 } 27 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 建造者模式 8 { 9 /// <summary> 10 /// 指挥建造过程 11 /// </summary> 12 public class Director 13 { 14 public void Construct(Builder builder) { 15 builder.BuildPartA(); 16 builder.BuildPartB(); 17 } 18 } 19 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 建造者模式 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 Director director = new Director(); 14 Builder builder1 = new ConcreteBuilder1(); 15 Builder builder2 = new ConcreteBuilder2(); 16 17 director.Construct(builder1); 18 Product product1 = builder1.GetResult(); 19 product1.Show(); 20 21 director.Construct(builder2); 22 Product product2 = builder2.GetResult(); 23 product2.Show(); 24 Console.Read(); 25 } 26 } 27 }