2016年2月25日 星期四

簡單工廠模式 Simple Factory Pattern

有一天當我在逛著Facebook的時候,PM突然敲我MSN,那時候非常流行MSN真的不要懷疑
我當時引以自豪的收集非常多的MSN表情圖示,讓我被當神一樣的崇拜
好了廢話不多說,以下是我跟PM的對話...

PM: 小奇,可以幫我弄一個營收活動嗎?
我:   當然可以
PM: 我想做一個轉蛋的活動
我:   是喔
PM: 就做成小瑪莉那樣好了,總共有12格

就類似以下圖示12格每一個會放一個虛寶

我:   好的沒問題喔
PM: 但我想要有一個條件,就是轉一次50元
PM: 我想讓玩家轉了1000元以上才有機會獲得高級實體虛寶,可以嗎?
我:   這.....雖然黑心了一點,當然沒問題XD

於是乎我就建立了一個
Gashapon.cs
using System;

namespace DesignPattern.SimpleFactoryPattern
{
    /*建立一個轉蛋的類別*/
    public class Gashapon
    {
        /*玩家被騙的金額*/
        private double _Amount = 0;

        public double Amount
        {
            get { return _Amount; }
            set { _Amount = value; }
        }

        /*玩家獲得的虛寶*/
        public virtual string GetItem()
        {
            string result = "";
            return result;
        }
    }
}


接著再建立一個高級虛寶的class繼承Gashapon

   class AdvancedItem : Gashapon
    {
        /*高級實體商品*/
        public override string GetItem()
        {
            /*高級實體商品邏輯運算,這邊簡略不實作*/
            return "高級實體商品";
        }
    }

在建立一個只能獲得普通虛寶的class繼承Gashapon
這一個類別裡面就只會計算普通虛寶的編號
    class GeneralItem : Gashapon
    {
        /*一般虛寶*/
        public override string GetItem()
        {
            /*一般爛虛寶邏輯運算,這邊簡略不實作*/
            return "一般爛虛寶";
        }
    }

所以這三個類別的用意就是,當如果玩家被騙了超過1000元我就要呼叫高級虛寶的類別來計算獲得高級虛寶的編號
如果未滿1000元就呼叫普通虛寶的類別計算,這樣玩家就會不知不覺狂抽,來增加營收
所以此時就可以利用簡單工廠模式來達成這樣的需求

所以在建立一個簡單工廠的class
    class SimpleFactory
    {
        public static Gashapon getItem(int amount)
        {
            Gashapon gash = null;

            /*當玩家消費超過1000元*/
            if (amount >= 1000)
                gash = new AdvancedItem();  /*呼叫高級實體商品*/
            else
                gash = new GeneralItem();   /*呼叫一般爛虛寶*/

            return gash;
        }
    }

所以整個完整的類別如以下
using System;

namespace DesignPattern.SimpleFactoryPattern
{
    /*建立一個轉蛋的類別*/
    public class Gashapon
    {
        /*玩家被騙的金額*/
        private double _Amount = 0;

        public double Amount
        {
            get { return _Amount; }
            set { _Amount = value; }
        }

        /*玩家獲得的虛寶*/
        public virtual string GetItem()
        {
            string result = "";
            return result;
        }
    }

    class AdvancedItem : Gashapon
    {
        /*高級實體商品*/
        public override string GetItem()
        {
            /*高級實體商品邏輯運算,這邊簡略不實作*/
            return "高級實體商品";
        }
    }

    class GeneralItem : Gashapon
    {
        /*一般虛寶*/
        public override string GetItem()
        {
            /*一般爛虛寶邏輯運算,這邊簡略不實作*/
            return "一般爛虛寶";
        }
    }

    /*簡單工廠類別*/
    class SimpleFactory
    {
        public static Gashapon getItem(int amount)
        {
            Gashapon gash = null;

            /*當玩家消費超過1000元*/
            if (amount >= 1000)
                gash = new AdvancedItem();  /*呼叫高級實體商品*/
            else
                gash = new GeneralItem();   /*呼叫一般爛虛寶*/

            return gash;
        }
    }
}
再利用主控台跑一下這一個簡單工廠模式,沒有問題就開始痛宰玩家了~哈哈
using System;

namespace DesignPattern.SimpleFactoryPattern
{
    class RunGame
    {
        static void Main()
        {
            try
            {
                Console.WriteLine("轉蛋開始...");
                Console.Write("請輸入玩家已消費金額");
                string strAmount = Console.ReadLine();

                Gashapon gash = null;
                gash = SimpleFactory.getItem(Convert.ToInt32(strAmount));

                Console.WriteLine("恭喜您獲得:" + gash.GetItem());
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("您輸入有錯:" + ex.Message);
                Console.ReadLine();
            }

        }
    }
}

沒有留言:

張貼留言