在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
Builder 模式主要用于“分步骤构建一个复杂的对 象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
变化点在哪里,封装哪里——Builder模式主要在 于应对“复杂对象各个部分”的频繁需求变动。其 缺点在于难以应对“分步骤构建算法”的需求变动。
using System;
using System.Collections.Generic;using System.Linq;
using System.Text;
using System.Collections;
namespace Design_Patterns
{
//对象 剧烈变化 算法不变
/// <summary>
/// 创建者模式
/// </summary>
class Director//指导者
{
public void Construct(Builder builder)
{
builder.BuildPartA();
builder.BuildPartB();
}
}
abstract class Builder//创建者
{
public abstract void BuildPartA();
public abstract void BuildPartB();
public abstract Product GetResult();
}
class ConcreateBuild1 :Builder
{
Product product = new Product();
public override void BuildPartA()
{
product.Add("PartA");
}
public override void BuildPartB()
{
product.Add("PartB");
}
public override Product GetResult()
{
return product;
}
}
class ConcreateBuild2 : Builder
{
Product product = new Product();
public override void BuildPartA()
{
product.Add("PartX");
}
public override void BuildPartB()
{
product.Add("PartY");
}
public override Product GetResult()
{
return product;
}
}
public class Product//产品
{
ArrayList parts = new ArrayList();
public void Add(string part)
{
parts.Add(part);
}
public void Show()
{
Console.WriteLine("\nProduct parts -----------");
foreach (string item in parts)
{
Console.WriteLine(item);
}
}
}
// 指导者 Director 服务员
public class Waiter
{
public void MakeDinner(Kitchener kit)
{
kit.MakeDishes();
kit.MakeSoup();
kit.MakeRice();
kit.Drink();
}
}
// 创建者 Builder 厨师
public abstract class Kitchener
{
public abstract void MakeDishes();//做菜
public abstract void MakeSoup();//做汤
public abstract void MakeRice();//做饭
public abstract void Drink();//饮料
public abstract Food GetFood();
}
// 中国厨师
public class ChinaKitchener : Kitchener
{
Food f = new Food();
string strtemp = string.Empty;
public override void MakeDishes()
{
strtemp = f.AddKinds(" China Dishes ");
}
public override void MakeSoup()
{
strtemp = f.AddKinds(" China Soup ");
}
public override void MakeRice()
{
strtemp = f.AddKinds(" China Rice ");
}
public override void Drink()
{
strtemp = f.AddKinds(" China Drink ");
}
public override Food GetFood()
{
f.FoodName = " China Food ";
return f;
}
}
// 法国厨师
public class FranceKitchener : Kitchener
{
Food f = new Food();
string strtemp = string.Empty;
public override void MakeDishes()
{
strtemp = f.AddKinds(" France Dishes ");
}
public override void MakeSoup()
{
strtemp = f.AddKinds(" France Soup ");
}
public override void MakeRice()
{
strtemp = f.AddKinds(" France Rice ");
}
public override void Drink()
{
strtemp = f.AddKinds(" France Drink ");
}
public override Food GetFood()
{
f.FoodName = " France Food ";
return f;
}
}
// 美国厨师
public class USAKitchener : Kitchener
{
Food f = new Food();
string strtemp = string.Empty;
public override void MakeDishes()
{
strtemp = f.AddKinds(" USA Dishes ");
}
public override void MakeSoup()
{
strtemp = f.AddKinds(" USA Soup ");
}
public override void MakeRice()
{
strtemp = f.AddKinds(" USA Rice ");
}
public override void Drink()
{
strtemp = f.AddKinds(" USA Drink ");
}
public override Food GetFood()
{
f.FoodName = " USA Food ";
return f;
}
}
// 食物
public class Food
{
private string foodName = string.Empty;
public string FoodName
{
get { return foodName; }
set { foodName = value; }
}
public string AddKinds(string kindStr)
{
// 加工
return kindStr;
}
}
}