用户需求:
设计思路:
1.UML图
2.采用建造者模式讲一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现。
3.建造者模式是一步一步创建一个复杂的对象,它允许用户只通过制定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
具体代码实现:
1.抽象部件
Part类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public abstract class Part { public abstract void Show(); } }
2.具体部件
MCBurger 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class MCBurger:Part { public override void Show() { Console.WriteLine("麦当劳:双层吉士汉堡"); } } }
MCChips 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class MCChips:Part { public override void Show() { Console.WriteLine("麦当劳:薯条"); } } }
MCDrink 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class MCDrink:Part { public override void Show() { Console.WriteLine("麦当劳:可口可乐"); } } }
KFCBurger 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class KFCBurger:Part { public override void Show() { Console.WriteLine("肯德基:香辣鸡腿堡"); } } }
KFCChips 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class KFCChips:Part { public override void Show() { Console.WriteLine("肯德基:薯条"); } } }
KFCDrink 类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class KFCDrink:Part { public override void Show() { Console.WriteLine("肯德基:百事可乐"); } } }
3.产品
Meal类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class Meal { protected List<Part> _parts = new List<Part>(); public void AddPart(Part part) { _parts.Add(part); } public void Show() { foreach (Part part in _parts) { part.Show(); } } } }
4.抽象建造者
MealBuilder类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public abstract class MealBuilder { protected Meal _meal = new Meal(); public abstract void BuildBurger(); public abstract void BuildChips(); public abstract void BuildDrink(); public Meal GetMeal() { return _meal; } } }
5.具体建造者
MealKFCBuilder类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class MealKFCBuilder:MealBuilder { public override void BuildBurger() { _meal.AddPart(new KFCBurger()); } public override void BuildChips() { _meal.AddPart(new KFCChips()); } public override void BuildDrink() { _meal.AddPart(new KFCDrink()); } } }
MealMCBuilder类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class MealMCBuilder:MealBuilder { public override void BuildBurger() { _meal.AddPart(new MCBurger()); } public override void BuildChips() { _meal.AddPart(new MCChips()); } public override void BuildDrink() { _meal.AddPart(new MCDrink()); } } }
MealMixBuilder类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class MealMixBuilder:MealBuilder { public override void BuildBurger() { _meal.AddPart(new KFCBurger()); } public override void BuildChips() { _meal.AddPart(new MCChips()); } public override void BuildDrink() { _meal.AddPart(new KFCDrink()); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class MealMixBuilder:MealBuilder { public override void BuildBurger() { _meal.AddPart(new KFCBurger()); } public override void BuildChips() { _meal.AddPart(new MCChips()); } public override void BuildDrink() { _meal.AddPart(new KFCDrink()); } } }
6.指挥者
Mealdirector类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class MealDirector { private MealBuilder _builder; public MealDirector(MealBuilder builder) { _builder = builder; } public Meal CreateMeal() { _builder.BuildBurger(); _builder.BuildChips(); _builder.BuildDrink(); return _builder.GetMeal(); } } }
7.客户端
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { MealKFCBuilder kfcbuilder = new MealKFCBuilder(); MealDirector kfcdirector = new MealDirector(kfcbuilder); Console.WriteLine(" 菜单 "); Console.WriteLine("--------------------"); kfcdirector.CreateMeal().Show(); Console.WriteLine("--------------------"); Console.WriteLine(""); MealMCBuilder mcbuilder = new MealMCBuilder(); MealDirector mcdirector = new MealDirector(mcbuilder); Console.WriteLine(" 菜单 "); Console.WriteLine("--------------------"); mcdirector.CreateMeal().Show(); Console.WriteLine("--------------------"); Console.WriteLine(""); MealMixBuilder mixbuilder = new MealMixBuilder(); MealDirector mixdirector = new MealDirector(mixbuilder); Console.WriteLine(" 菜单 "); Console.WriteLine("--------------------"); mixdirector.CreateMeal().Show(); Console.WriteLine("--------------------"); Console.WriteLine(""); Console.Read(); } } }
运行结果:
体会与感悟:
建造者模式:
优点:将产品本身与产品的创建过程解耦。
使用不同的建造者即可得到不同类型的产品。
增加新的产品类型只需要增加新的建造者,符合“开放--封闭原则”。
缺点:如果产品之间的差异性很大,则不适合建造者模式。
如果产品的内部变化复杂,可能会需要定义很多具体建造者类来适应这种变化,导致系统变得很庞大。