1. 程式人生 > >C#設計模式--建造者模式

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

設計模式:

建造者模式(Builder Pattern)

簡單介紹:

建造者模式參與者:

  • Builder:為建立一個Product物件的各個部件指定抽象介面;
  •  ConcreteBuilder

    ° 實現Builder的介面以構造和裝配該產品的各個部件

    ° 定義並明確它所建立的表示

    ° 提供一個檢索Product的介面

  •  Director:構造一個使用Builder介面的物件;
  • Product

    ° 表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程

    ° 包含定義組成部件的類,包括將這些部件裝配成最終產品的介面

  在建造者模式中,Director規定了建立一個物件所需要的步驟和次序,Builder則提供了一些列完成這些步驟的方法,ConcreteBuilder給出了這些方法的具體實現,是物件的直接建立者。

建造者模式類圖:

 建造者模式c#程式碼舉例:

 Product類 產品類

public class Product
    {
        private List<string> _parts = new List<string>();

        public void Add(string part)
        {
            _parts.Add(part);
        }

        public void Show()
        {
            Console.WriteLine("Product Parts");
            foreach (string part in _parts)
            {
                Console.WriteLine(part);
            }
        }
    }

Builder類 抽象介面類

/// <summary>
    /// 為建立一個Product物件的各個部件指定抽象介面
    /// </summary>
    public abstract class Builder
    {
        public abstract void BuildPart();
        public abstract Product GetResult();
    }

ConcreteBuilder類 具體建立者類

    public class ConcreteBuilder : Builder
    {
        private Product _product = new Product();

        public override void BuildPart()
        {
            _product.Add("Part");
        }

        public override Product GetResult()
        {
            return _product;
        }
    }

Director類 提供使用Builder類的介面

public class Director
    {
        /// <summary>
        /// 構造一個使用Builder介面的物件
        /// </summary>
        public void Construct(Builder builder)
        {
            builder.BuildPart();
        }
    }

測試程式碼:

    class Test
    {
        static void Main(string[] args)
        {
            // Create director and builders
            Director director = new Director();

            Builder b1 = new ConcreteBuilder();

            // Construct two products
            director.Construct(b1);
            Product p1 = b1.GetResult();
            p1.Show();

            Console.Read();
        }
    }

執行結果:

例項舉例,手機生產舉例  

  • Builder-->MobilePhoneBuilder
  •  ConcreteBuilder-->XiaoMIBuilder和AppleBuilder
  •  Director-->Factory
  • Product -->MobilePhone

分別有:手機品牌(brand),處理器(cup),執行記憶體(ram),外接記憶體(rom)資訊

MobilePhone類產品類 

public class MobilePhone
    {
        private string _brand;
        private Dictionary<string, string> _Info = new Dictionary<string, string>();

        public string this[string key]
        {
            get { return _Info[key]; }
            set { _Info[key] = value; }
        }
        public MobilePhone(string brand)
        {
            this._brand = brand;
        }
        public void Show()
        {
            Console.WriteLine("\n-----Info--------");
            Console.WriteLine(" BRAND: {0}", _brand);
            Console.WriteLine(" CPU  : {0}", _Info["cpu"]);
            Console.WriteLine(" RAM  : {0}", _Info["ram"]);
            Console.WriteLine(" ROM  : {0}", _Info["rom"]);
        }
    }

MobilePhoneBuilder類 建立者抽象類

 public abstract class MobilePhoneBuilder
    {
        protected MobilePhone _mobilePhone;

       
        public MobilePhone mobilePhone
        {
            get { return _mobilePhone; }
        }

        // Abstract build methods
        public abstract void BuildCPU();
        public abstract void BuildRAM();
        public abstract void BuildROM();
        
    }

XiaoMIBuilder類 小米手機建立者類

public class XiaoMIBuilder:MobilePhoneBuilder
    {
        public XiaoMIBuilder()
        {
            _mobilePhone = new MobilePhone("小米5s");
        }
        public override void BuildCPU()
        {
            _mobilePhone["cpu"] = "驍龍821";
        }

        public override void BuildRAM()
        {
            _mobilePhone["ram"] = "4G";
        }

        public override void BuildROM()
        {
            _mobilePhone["rom"] = "32G";
        }
    }

AppleBuilder類 蘋果手機的具體建立類

public class AppleBuilder:MobilePhoneBuilder
    {
        public AppleBuilder()
        {
            _mobilePhone = new MobilePhone("iphone7s plus");
        }
        public override void BuildCPU()
        {
            _mobilePhone["cpu"] = "A10";
        }

        public override void BuildRAM()
        {
            _mobilePhone["ram"] = "2G";
        }

        public override void BuildROM()
        {
            _mobilePhone["rom"] = "128G";
        }
    }

Factory類,提供建立者的介面

    public class Factory
    {
        public void Construct(MobilePhoneBuilder mobilePhoneBuilder)
        {
            mobilePhoneBuilder.BuildCPU();
            mobilePhoneBuilder.BuildRAM();
            mobilePhoneBuilder.BuildROM();
        }
    }

測試程式碼:

    class Test
    {
        static void Main(string[] args)
        {
            MobilePhoneBuilder builder;
            Factory factory = new Factory();

            builder = new XiaoMIBuilder();
            factory.Construct(builder);
            builder.mobilePhone.Show();

        
            builder = new AppleBuilder();
            factory.Construct(builder);
            builder.mobilePhone.Show();

            Console.Read();
        }
    }

執行結果: