K書記錄-大話設計模式-創造者模式

創造者模式和範例

工作忙+懶惰導致這系列差點難產,不過還是繼續了

任務 : 創建機器,機器A有partI,partJ,機器B有partX,partY

UML : (有點不同,就將就點吧)

1.建立抽象的創造者

程式碼 :

    public abstract class Builder
    {
        public abstract void BuildPartA();
        public abstract void BuildPartB();
        public abstract Product GetResult();
    }

說明 : 繼承此抽象的類別必須要會製造PartA和PartB,並且要能得到組合結果。

 

2.建立part的容器

程式碼 :

public class Machine
    {
        IList<string> parts = new List<String>();

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

        public void Show()
        {
            Console.WriteLine("Product has been build");
            foreach (var part in parts)
            {
                Console.WriteLine(part);
            }
        }
    }

說明 : 建立一個機器的容器,可以收納也可以顯示內部有甚麼part

 

3.機器A、B繼承Builder並完成part的插入

程式碼 :

public class MachineA : Builder
    {
        private Machine machine = new Machine();

        public override void BuildPartA()
        {
            machine.Add("Part I");
        }

        public override void BuildPartB()
        {
            machine.Add("Part J");
        }

        public override Machine GetResult()
        {
            return machine;
        }
    }  
    public class MachineB : Builder
    {
        private Machine machine = new Machine();

        public override void BuildPartA()
        {
            machine.Add("Part X");
        }

        public override void BuildPartB()
        {
            machine.Add("Part Y");
        }

        public override Machine GetResult()
        {
            return machine;
        }
    }

說明 : 不同的機器分別有不同的part,在類別內實作插入part的動作。

 

4.建立Director

程式碼 :

    public class Director
    {
        public void Construct(Builder builder)
        {
            builder.BuildPartA();
            builder.BuildPartB();
        }
    } 

說明 : 因為建立的步驟都是固定的,所以把步驟封裝起來,這樣每個機器組裝的步驟都會相同。

 

5.使用方式

程式碼 :

        static void Main(string[] args)
        {
            Director director = new Director();

            Builder builder1 = new MachineA();
            director.Construct(builder1);
            Machine product = builder1.GetResult();
            product.Show();

            Builder builder2 = new MachineB();
            director.Construct(builder2);
            Machine product2 = builder2.GetResult();
            product2.Show();

            Console.ReadLine();
        }

說明 :

  1. 建立director等待Builder傳入執行
  2. 建立Builder為MachineA
  3. Director代替Builder執行步驟
  4. 取得此機器的內容
  5. 顯示內容物

小結 :

創造者模式封裝了步驟,外部不需要知道機器怎麼組裝的,只需要知道組裝的結果,而每個機器的步驟都是先裝PartA再來是PartB,如果順序交換了也只要在Director內顛倒順序,這樣所有建造的步驟就會修改,不用再一個一個修改步驟。

 

 

任務2 : 麵Builder

程式碼 :


    public class Noodle
    {
        IList<string> parts = new List<string>();
        public void Add(string part)
        {
            parts.Add(part);
        }

        public void DishUp()
        {
            foreach (var part in parts)
            {
                Console.WriteLine(part);
            }
        }
    }

    public abstract class NoodleBuilder
    {
        public abstract void FirstStep();
        public abstract void SecondStep();
        public abstract Noodle GetNoodle();
    }

public class Yakisoba : NoodleBuilder
    {
        private Noodle noodle = new Noodle();
        public override void FirstStep()
        {
            noodle.Add("加黃麵");
        }

        public override Noodle GetNoodle()
        {
            return noodle;
        }

        public override void SecondStep()
        {
            noodle.Add("加醬油");
        }
    }    
    public class Udonn : NoodleBuilder
    {
        private Noodle noodle = new Noodle();
        public override void FirstStep()
        {
            noodle.Add("加烏龍麵");
        }

        public override Noodle GetNoodle()
        {
            return noodle;
        }

        public override void SecondStep()
        {
            noodle.Add("加湯");
        }
    }

    public class NoodleDirector
    {
        public void DoProcess(NoodleBuilder noodleBuilder)
        {
            noodleBuilder.FirstStep();
            noodleBuilder.SecondStep();
        }
    }

        static void Main(string[] args)
        {
            NoodleDirector noodleDirector = new NoodleDirector();

            NoodleBuilder yakisobaBuilder = new Yakisoba();
            noodleDirector.DoProcess(yakisobaBuilder);
            Noodle yakisoba = yakisobaBuilder.GetNoodle();
            yakisoba.DishUp();

            NoodleBuilder udonnBuilder = new Udonn();
            noodleDirector.DoProcess(udonnBuilder);
            Noodle ramenn = udonnBuilder.GetNoodle();
            ramenn.DishUp();

            Console.ReadLine();
        }

說明 :

想吃甚麼就把哪個Builder丟進去Director內,裡面會自己把步驟做完後就完成那道料理。

 

新手上路,若有錯誤請不吝嗇指教,謝謝。