第550篇--设计模式系统-Builder
基础类:Computer
GameComputerBuilder: 建造者1
OfficeComputerBuilder:建造者2
ComputerBuilder: 建造者基类, 提供一些需要重写的方法,由子类去重写和实现,实现不同的建造过程。
ComputerFactory: 传入建造者,开始建造
看看客户端的代码,用户先是选择了一个具体的Builder,用户应该很明确它需要游戏电脑还是办公电脑,但是它可以对电脑一无所知,由销售人员给出一个合理的配置单。然后用户让ComputerFactory去为它组装这个电脑。组装完成后ComputerFactory开机,给用户验收电脑的配置是否正确。
l 你或许觉得ComputerBuilder和是抽象工厂模式中的抽象工厂角色差不多,GameComputerBuilder又 像是具体工厂。其实,建造者模式和抽象工厂模式的侧重点不同,前者强调一个组装的概念,一个复杂对象由多个零件组装而成并且组装是按照一定的标准射顺序进行的,而后者强调的是创建一系列产品。建造者模式适用于组装一台电脑,而抽象工厂模式适用于提供用户笔记本电脑、台式电脑和掌上电脑的产品系列。
何时采用
l 从代码角度来说, 如果你希望分离复杂类型构建规则和类型内部组成,或者希望把相同的构建过程用于构建不同类型的时候可以考虑使用建造者模式。
l 从应用角度来说, 如果你希望解耦产品的创建过程和产品的具体配件,或者你希望为所有产品的创建复用一套稳定并且复杂的逻辑的时候可以考虑使用建造者模式
代码:
using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespace BuilderDemo { class Program { static void Main(string[] args) { ComputerFactory factory = new ComputerFactory(); ComputerBuilder office = new OfficeComputerBuilder(); factory.BuildComputer(office); office.Computer.ShowSystemInfo(); ComputerBuilder game = new GameComputerBuilder(); factory.BuildComputer(game); game.Computer.ShowSystemInfo(); } } class ComputerFactory { public void BuildComputer(ComputerBuilder cb) { Console.WriteLine(); Console.WriteLine(">>>>>>>>>>>>>>>>>>Start Building " + cb.Name); // ComputerFactory建造是需要一定的顺序的 cb.SetupMainboard(); cb.SetupCpu(); cb.SetupMemory(); cb.SetupHarddisk(); cb.SetupVideocard(); Console.WriteLine(">>>>>>>>>>>>>>>>>>Build " + cb.Name + " Completed"); Console.WriteLine(); } } /// <summary> /// 建造者基类,只提供一些基类方法,具休的实现,由子类重写 /// </summary> abstract class ComputerBuilder { protected string name; public string Name { get { return name; } set { name = value; } } protected Computer computer; public Computer Computer { get { return computer; } set { computer = value; } } public ComputerBuilder() { computer = new Computer(); } public abstract void SetupMainboard(); public abstract void SetupCpu(); public abstract void SetupMemory(); public abstract void SetupHarddisk(); public abstract void SetupVideocard(); } /// <summary> /// 建造者1 /// </summary> class OfficeComputerBuilder : ComputerBuilder { public OfficeComputerBuilder() { name = "OfficeComputer"; } /// <summary> /// 重写 /// </summary> public override void SetupMainboard() { computer.Mainboard = "Abit升技LG-95C 主板(Intel 945GC芯片组/LGA 775/1066MHz) "; } /// <summary> /// 重写 /// </summary> public override void SetupCpu() { computer.Cpu = "Intel 英特尔赛扬D 336 (2.8GHz/LGA 775/256K/533MHz) "; } /// <summary> /// 重写 /// </summary> public override void SetupMemory() { computer.Memory = "Patriot博帝DDR2 667 512MB 台式机内存"; } /// <summary> /// 重写 /// </summary> public override void SetupHarddisk() { computer.Harddisk = "Hitachi日立SATAII接口台式机硬盘(80G/7200转/8M)盒装"; } /// <summary> /// 重写 /// </summary> public override void SetupVideocard() { computer.Videocard = "主板集成"; } } /// <summary> /// 建造者2 /// </summary> class GameComputerBuilder : ComputerBuilder { public GameComputerBuilder() { name = "GameComputer"; } public override void SetupMainboard() { computer.Mainboard = "GIGABYTE技嘉GA-965P-DS3 3.3 主板(INTEL P965 东莞产)"; } public override void SetupCpu() { computer.Cpu = "Intel 英特尔酷睿E4400 (2.0GHz/LGA 775/2M/800MHz)盒装"; } public override void SetupMemory() { computer.Memory = "G.SKILL 芝奇F2-6400CL5D-2GBNQ DDR2 800 1G*2台式机内存"; } public override void SetupHarddisk() { computer.Harddisk = "Hitachi日立SATAII接口台式机硬盘(250G/7200转/8M)盒装"; } public override void SetupVideocard() { computer.Videocard = "七彩虹逸彩GT-GD3 UP烈焰战神H10 显卡(GeForce 8600GT/256M/DDR3)支持HDMI!"; } } /// <summary> /// Computer元数据 /// </summary> class Computer { private string videocard; public string Videocard { get { return videocard; } set { videocard = value; } } private string cpu; public string Cpu { get { return cpu; } set { cpu = value; } } private string mainboard; public string Mainboard { get { return mainboard; } set { mainboard = value; } } private string memory; public string Memory { get { return memory; } set { memory = value; } } private string harddisk; public string Harddisk { get { return harddisk; } set { harddisk = value; } } public void ShowSystemInfo() { Console.WriteLine("==================SystemInfo=================="); Console.WriteLine("CPU:" + cpu); Console.WriteLine("MainBoard:" + mainboard); Console.WriteLine("Memory:" + memory); Console.WriteLine("VideoCard:" + videocard); Console.WriteLine("HardDisk:" + harddisk); } } }
UML类图:
代码和UML源图:https://skydrive.live.com/#cid=6B286CBEF1610557&id=6B286CBEF1610557!732