2016年7月11日 星期一

創建者模式 Builder Pattern

PM:小奇,我發現上個月營收不好
PM:這次豁出去了!
PM:直接來賣整套套裝了...
PM:也就是轉一次就給你一個指定套裝,但是數值好壞就看個人運氣了
PM:所以目前總共有5套,但是改版後可能會新增2套
我:好的,沒問題

所以這次的需求,是要抽套裝,套裝裡面有頭盔、上衣、褲子、手套、鞋子
所以這5樣套裝的東西是固定的,只是套裝的種類是會變來變去的
如:王朝套裝、帝國套裝、雜七雜八套裝

PM又說了,改版後會在新增兩件套裝,所以之後會在加兩件套裝上去
於是使用創建者模式寫寫看

using System;

namespace DesignPattern.BuilderPattern
{
    class Run
    {
        static void Main(string[] args)
        {
            Director director = new Director();
            Bulider bulider = new KingSet();    //獲取王朝套裝
            director.setBulider(bulider);
            director.create();

            Console.WriteLine("----------");

            bulider = new EmpireSet();  //獲取帝國套裝
            director.setBulider(bulider);
            director.create();
            Console.ReadLine();
        }

        //套裝的裝備項目
        interface Bulider
        {
            //獲得頭盔
            void getHat();
            //獲得上衣     
            void getCoat();
            //獲得褲子      
            void getPants();
            //獲得手套    
            void getGloves();
            //獲得鞋子
            void getShoe();       
        }

        //統一由指揮者 class 執行生產步驟
        class Director
        {
            private Bulider builder;
            public void setBulider(Bulider builder)
            {
                this.builder = builder;
            }
            public void create()
            {
                this.builder.getHat();
                this.builder.getCoat();
                this.builder.getPants();
                this.builder.getGloves();
                this.builder.getShoe();
            }
        }

        //王朝套裝
        class KingSet : Bulider
        {
            public void getHat()
            {
                Console.WriteLine("獲得王朝套裝-頭盔");
            }
            public void getCoat()
            {
                Console.WriteLine("獲得王朝套裝-上衣");
            }

            public void getPants()
            {
                Console.WriteLine("獲得王朝套裝-褲子");
            }

            public void getGloves()
            {
                Console.WriteLine("獲得王朝套裝-手套");
            }

            public void getShoe()
            {
                Console.WriteLine("獲得王朝套裝-鞋子");
            }
        }

        //帝國套裝
        class EmpireSet : Bulider
        {
            public void getHat()
            {
                Console.WriteLine("獲得帝國套裝-頭盔");
            }
            public void getCoat()
            {
                Console.WriteLine("獲得帝國套裝-上衣");
            }

            public void getPants()
            {
                Console.WriteLine("獲得帝國套裝-褲子");
            }

            public void getGloves()
            {
                Console.WriteLine("獲得帝國套裝-手套");
            }

            public void getShoe()
            {
                Console.WriteLine("獲得帝國套裝-鞋子");
            }
        }
    }
}

所以這邊我創建了一個interface  Bulider內容就是套裝的項目,這些都是固定的
然後又創建了一個Director類別,負責產生套裝
然後創建王朝套裝(KingSet)的類別繼承Bulider,來實做得到的內容
所以改版後,新增的兩件套裝,我就可以在新增兩個類別來實做新的套裝
這邊也就不會動到之前的套裝的類別

沒有留言:

張貼留言