c#設計模式-建造者模式

來源:互聯網
上載者:User

意圖

 

       將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。

 

情境

 

       在電腦城裝機總有這樣的經曆。我們到了店裡,先會有一個銷售人員來詢問你希望裝的機器是怎麼樣的配置,他會給你一些建議,最終會形成一張裝機單。和客戶確定了裝機配置以後,他會把這張單字交給提貨的人,由他來準備這些配件,準備完成後交給裝機技術人員。技術人員會把這些配件裝成一個整機交給客戶。

       不管是什麼電腦,它總是由CPU、記憶體、主板、硬碟以及顯卡等組件構成的,並且裝機的過程總是固定的:

l         把主板固定在機箱中

l         把CPU安裝到主板上

l         把記憶體安裝到主板上

l         把硬碟串連到主板上

l         把顯卡安裝到主板上

但是,每台相容機的組件都各不相同的,有些配置高一點,有些配置低一點,這是變化點。對於裝機技術人員來說,他不需要考慮這些配件從哪裡來的,他只需要把他們組裝在一起了,這是穩定的裝機流程。要把這種變化的配件和穩定的流程進行分離就需要引入Builder模式。

 

範例程式碼

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection;

 

namespace BuilderExemple

{

    classProgram

    {

        staticvoid Main(string[] args)

        {

            ComputerFactory factory = newComputerFactory();

            ComputerBuilder office = newOfficeComputerBuilder();

            factory.BuildComputer(office);

            office.Computer.ShowSystemInfo();

            ComputerBuilder game = newGameComputerBuilder();

            factory.BuildComputer(game);

            game.Computer.ShowSystemInfo();

        }

    }

 

    classComputerFactory

    {

        publicvoid 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();

        }

    }

 

    abstractclassComputerBuilder

    {

        protectedstring name;

 

        publicstring Name

        {

            get { return name; }

            set { name = value; }

        }

 

        protectedComputer computer;

 

        publicComputer Computer

        {

            get { return computer; }

            set { computer = value; }

        }

 

        public ComputerBuilder()

        {

            computer = newComputer();

        }

 

        publicabstractvoid SetupMainboard();

        publicabstractvoid SetupCpu();

        publicabstractvoid SetupMemory();

        publicabstractvoid SetupHarddisk();

        publicabstractvoid SetupVideocard();

    }

 

    classOfficeComputerBuilder : ComputerBuilder

    {

        public OfficeComputerBuilder()

        {

            name = "OfficeComputer";

        }

 

        publicoverridevoid SetupMainboard()

        {

            computer.Mainboard = "Abit升技LG-95C 主板(Intel 945GC晶片集/LGA 775/1066MHz) ";

        }

 

        publicoverridevoid SetupCpu()

        {

            computer.Cpu = "Intel 英特爾賽揚D 336 (2.8GHz/LGA 775/256K/533MHz)  ";

        }

 

        publicoverridevoid SetupMemory()

        {

            computer.Memory = "Patriot博帝DDR2 667 512MB 台式機記憶體";

        }

 

        publicoverridevoid SetupHarddisk()

        {

            computer.Harddisk = "Hitachi日立SATAII介面台式機硬碟(80G/7200轉/8M)盒裝";

        }

 

        publicoverridevoid SetupVideocard()

        {

            computer.Videocard = "主板整合";

        }

    }

 

    classGameComputerBuilder : ComputerBuilder

    {

        public GameComputerBuilder()

        {

            name = "GameComputer";

        }

 

        publicoverridevoid SetupMainboard()

        {

            computer.Mainboard = "GIGABYTE技嘉GA-965P-DS3 3.3 主板(INTEL P965 東莞產)" ;

        }

 

        publicoverridevoid SetupCpu()

        {

            computer.Cpu = "Intel 英特爾酷睿E4400 (2.0GHz/LGA 775/2M/800MHz)盒裝";

        }

 

        publicoverridevoid SetupMemory()

        {

            computer.Memory = "G.SKILL 芝奇F2-6400CL5D-2GBNQ DDR2 800 1G*2台式機記憶體";

        }

 

        publicoverridevoid SetupHarddisk()

        {

            computer.Harddisk = "Hitachi日立SATAII介面台式機硬碟(250G/7200轉/8M)盒裝";

        }

 

        publicoverridevoid SetupVideocard()

        {

            computer.Videocard = "七彩虹逸彩GT-GD3 UP烈焰戰神H10 顯卡(GeForce 8600GT/256M/DDR3)支援HDMI!";

        }

    }

 

    classComputer

    {

        privatestring videocard;

 

        publicstring Videocard

        {

            get { return videocard; }

            set { videocard = value; }

        }

 

        privatestring cpu;

 

        publicstring Cpu

        {

            get { return cpu; }

            set { cpu = value; }

        }

 

        privatestring mainboard;

 

        publicstring Mainboard

        {

            get { return mainboard; }

            set { mainboard = value; }

        }

 

        privatestring memory;

 

        publicstring Memory

        {

            get { return memory; }

            set { memory = value; }

        }

 

        privatestring harddisk;

 

        publicstring Harddisk

        {

            get { return harddisk; }

            set { harddisk = value; }

        }

 

        publicvoid ShowSystemInfo()

        {

            Console.WriteLine("==================SystemInfo==================");

            Console.WriteLine("CPU:" + cpu);

            Console.WriteLine("MainBoard:" + mainboard);

            Console.WriteLine("Memory:" + memory);

            Console.WriteLine("VideoCard:" + videocard);

            Console.WriteLine("HardDisk:" + harddisk);

        }

    }

}

代碼執行結果如:

 

 

代碼說明

 

l         ComputerFactory是建造者模式的指導者。指導者做的是穩定的建造工作,假設它就是一個技術人員,他只是在做按照固定的流程,把配件組裝成電腦的重複勞動工作。他不知道他現在組裝的是一台遊戲電腦還是一台辦公用電腦,他也不知道他往主板上安裝的記憶體是1G還是2G的。呵呵,看來是不稱職的技術人員。

l         ComputerBuilder是抽象建造者角色。它主要是用來定義兩種介面,一種介面用於規範產品的各個部分的組成。比如,這裡就規定了組裝一台電腦所需要的5個工序。第二種介面用於返回建造後的產品,在這裡我們沒有定義抽象方法,反正建造出來的總是電腦。

l         OfficeComputerBuilder和GameComputerBuilder是具體的建造者。他的工作就是實現各建造步驟的介面,以及實現返回產品的介面,在這裡後者省略了。

l         Computer就是建造出來的複雜產品。在代碼中,我們的各種建造步驟都是為建立產品中的各種配件服務的,Computer定義了一個相對具體的產品,在應用中可以把這個產品進行比較高度的抽象,使得不同的具體建造者甚至可以建造出完全不同的產品。

l         看看用戶端的代碼,使用者先是選擇了一個具體的Builder,使用者應該很明確它需要遊戲電腦還是辦公電腦,但是它可以對電腦一無所知,由銷售人員給出一個合理的配置單。然後使用者讓ComputerFactory去為它組裝這個電腦。組裝完成後ComputerFactory開機,給使用者驗收電腦的配置是否正確。

l         你或許覺得ComputerBuilder和是抽象原廠模式中的抽象工廠角色差不多,GameComputerBuilder又像是具體工廠。其實,建造者模式和抽象原廠模式的側重點不同,前者強調一個組裝的概念,一個複雜物件由多個零件組裝而成並且組裝是按照一定的標準射順序進行的,而後者強調的是建立一系列產品。建造者模式適用於組裝一台電腦,而抽象原廠模式適用於提供使用者膝上型電腦、台式電腦和掌上型電腦的產品系列。

 

何時採用

 

l         從代碼角度來說, 如果你希望分離複雜類型構建規則和類型內部組成,或者希望把相同的構建過程用於構建不同類型的時候可以考慮使用建造者模式。

l         從應用角度來說, 如果你希望解耦產品的建立過程和產品的具體配件,或者你希望為所有產品的建立複用一套穩定並且複雜的邏輯的時候可以考慮使用建造者模式。

 

實現要點

 

l         對象的構建過程由指導者完成,具體的組成由具體建造者完成,表示與構建分離。

l         建造者和指導者是建造者模式的關鍵點,如果進行合并或省略就可能會轉變到模版方法模式。

l         如果對象的建造步驟是簡單的,並且產品擁有一致的介面可以轉而使用原廠模式。

 

注意事項

 

l         返回產品的方法是否必須,是否一定要在抽象建造者中有介面根據實際情況而定。如果它們有統一的介面可以在抽象建造者中體現這個抽象方法,如果沒有統一的介面(比如,生產毫無關聯的產品)則可以在具體建造者中各自實現這個方法,如果建立的產品是一種產品,那麼甚至可以省略返回產品的介面(本文的例子就是這樣)。

原文連結:http://www.cnblogs.com/lovecherry/archive/2007/10/07/915986.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.