Builder產生器模式(建立型)
作用:
Builder產生器模式將產生複雜物件的具體過程和它的建構函式分離開,同樣的構造過程可以執行個體出不同的對象。
Role
The Builder pattern separates the specification of a complex object from its actual construction. The same construction process can create different representations.
設計:
產生器介面IBuilder,定義要Build哪些內容
執行個體對象控制器Director,包含一系列產生對象的操作
產生器Builder,被執行個體化對象控制器Director調用來執行個體化對象
對象Product,由多部分組成的對象
舉例:
IBuilder 製造鋼筆的一系列規範
Director 使用BuilderA製造鋼筆
BuilderA 某種按IBuilder規範製造鋼筆的方法
Product 由多個零件組成的鋼筆
代碼:
代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Builder
{
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace BuilderExemple
{
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);
cb.SetupMainboard();
cb.SetupCpu();
cb.SetupMemory();
cb.SetupHarddisk();
cb.SetupVideocard();
Console.WriteLine(">>>>>>>>>>>>>>>>>>Build " + cb.Name + " Completed");
Console.WriteLine();
}
}
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();
}
class OfficeComputerBuilder : ComputerBuilder
{
public OfficeComputerBuilder()
{
name = "OfficeComputer";
}
public override void SetupMainboard()
{
computer.Mainboard = "Abit升技 LG-95C 主板 (Intel 945GC晶片集/LGA 775/1066MHz) ";
}
public override void SetupCpu()
{
computer.Cpu = "Intel 英特爾賽揚D 336 (2.8GHz/LGA 775/256K/533MHz) ";
}
public override void SetupMemory()
{
computer.Memory = "Patriot博帝 DDR2 667 512MB 台式機記憶體";
}
public override void SetupHarddisk()
{
computer.Harddisk = "Hitachi日立 SATAII介面台式機硬碟 (80G/7200轉/8M)盒裝";
}
public override void SetupVideocard()
{
computer.Videocard = "主板整合";
}
}
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 英特爾酷睿2 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 = "七彩虹 逸彩8600GT-GD3 UP烈焰戰神 H10 顯卡 (GeForce 8600GT/256M/DDR3)支援HDMI!";
}
}
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);
Console.ReadLine();
}
}
}
}
使用情境:
建立對象的各個組成部分的演算法是可以分離的;
組合起來的對象可能會有不同的表現
需要控制對象的構造過程
Use the Builder pattern when…
• The algorithm for creating parts is independent from the parts themselves.
• The object to be assembled might have different representations.
• You need fine control over the construction process.
總結:
Builder產生器模式是一種建立型模式,它主要是應對項目中一些複雜物件的建立工作。所謂“複雜物件”,是指:此對象中還含有其它的子物件。Builder模式應有的情景:複雜物件的各個部分的子物件可以用一定的演算法構成;由於需求的變化,這個複雜物件的各個部分經常面臨著劇烈的變化,但是將各個部分的子物件組合在一起的演算法卻相對穩定。簡單的說:子物件變化較頻繁,對組合子物件演算法相對穩定。
這是解決一個複雜物件的建立工作,現在變化的部分和相對穩定的部分已經明確,我們要做的是隔離變化,如何將子物件和演算法隔離是要解決的問題。
《設計模式》中說道:將一個複雜物件的構建與其表示向分離,使得同樣的構建過程可以建立不同的表示。Builder模式的幾個要點:
1、用於構建一個複雜的對象,但這個對象構建的演算法是穩定的,對象中的各個部分經常變化。
2、在於應對複雜物件各個部分的頻繁需求變動。但是難以應對演算法的需求變動。這點一定要注意,如果用複雜物件的內部子物件的組合演算法不穩定,使用Builder會帶來很多不必要的麻煩。