2016年3月6日 星期日

範本方法模式 Template Method Pattern

PM: 小奇奇,小奇奇
我:   0.0
PM: 最近營收很差,我發現我轉蛋賣太貴效果都不好
我:   那你就賣多種價錢的轉蛋阿,便宜到貴的
PM: 好像不錯喔,那我就把轉蛋的寶物都一樣,在依照不同的價錢給不同的屬性
PM: 想要省錢的就去轉比較便宜的
PM: 有錢人要神裝的就去轉貴的,好像也不錯
我:   0.0


所以這次的需求是,轉到的虛寶例如武器、裝備、飾品都是固定的
只有虛寶的屬性在變化,貴的就屬性比較好
所以這次使用範本方法模式寫寫看


首先先建立一個轉蛋的類別
    class Gashapon
    {
        public void ArmsItem()
        {
            Console.WriteLine("恭喜您獲得武器:" + getArmsItem());            
        }

        public void ArmorItem()
        {
            Console.WriteLine("恭喜您獲得盔甲:" + getArmorItem());            
        }

        public void AccessoriesItem()
        {
            Console.WriteLine("恭喜您獲得飾品:" + getAccessoriesItem());            
        }

        protected virtual string getArmsItem()
        {
            return "";
        }

        protected virtual string getArmorItem()
        {
            return "";
        }

        protected virtual string getAccessoriesItem()
        {
            return "";
        }   
    }
在建立3個不同價錢的轉蛋屬性Item
    //50元轉蛋的商品
    class Gashapon50 : Gashapon
    {
        protected override string getArmsItem()
        {
            return "+3武器";
        }

        protected override string getArmorItem()
        {
            return "+3盔甲";
        }

        protected override string getAccessoriesItem()
        {
            return "+3飾品";
        }
    }

    //500元轉蛋的商品
    class Gashapon500 : Gashapon
    {
        protected override string getArmsItem()
        {
            return "+7武器";
        }

        protected override string getArmorItem()
        {
            return "+7盔甲";
        }

        protected override string getAccessoriesItem()
        {
            return "+7飾品";
        }
    }

    //5000元轉蛋的商品
    class Gashapon5000 : Gashapon
    {
        protected override string getArmsItem()
        {
            return "+16武器";
        }

        protected override string getArmorItem()
        {
            return "+16盔甲";
        }

        protected override string getAccessoriesItem()
        {
            return "+16飾品";
        }
    }
主控台與完整的程式碼
using System;

namespace DesignPattern.TemplateMethodPattern
{
    class Run
    {
        static void Main()
        {
            Console.WriteLine("50元轉蛋:");
            Gashapon gash = new Gashapon50();
            gash.ArmsItem();
            gash.ArmorItem();
            gash.AccessoriesItem();

            Console.WriteLine("500元轉蛋:");
            gash = new Gashapon500();
            gash.ArmsItem();
            gash.ArmorItem();
            gash.AccessoriesItem();

            Console.WriteLine("5000元轉蛋:");
            gash = new Gashapon5000();
            gash.ArmsItem();
            gash.ArmorItem();
            gash.AccessoriesItem();

            Console.Read();
        }
    }

    class Gashapon
    {
        public void ArmsItem()
        {
            Console.WriteLine("恭喜您獲得武器:" + getArmsItem());            
        }

        public void ArmorItem()
        {
            Console.WriteLine("恭喜您獲得盔甲:" + getArmorItem());            
        }

        public void AccessoriesItem()
        {
            Console.WriteLine("恭喜您獲得飾品:" + getAccessoriesItem());            
        }

        protected virtual string getArmsItem()
        {
            return "";
        }

        protected virtual string getArmorItem()
        {
            return "";
        }

        protected virtual string getAccessoriesItem()
        {
            return "";
        }   
    }

    //50元轉蛋的商品
    class Gashapon50 : Gashapon
    {
        protected override string getArmsItem()
        {
            return "+3武器";
        }

        protected override string getArmorItem()
        {
            return "+3盔甲";
        }

        protected override string getAccessoriesItem()
        {
            return "+3飾品";
        }
    }

    //500元轉蛋的商品
    class Gashapon500 : Gashapon
    {
        protected override string getArmsItem()
        {
            return "+7武器";
        }

        protected override string getArmorItem()
        {
            return "+7盔甲";
        }

        protected override string getAccessoriesItem()
        {
            return "+7飾品";
        }
    }

    //5000元轉蛋的商品
    class Gashapon5000 : Gashapon
    {
        protected override string getArmsItem()
        {
            return "+16武器";
        }

        protected override string getArmorItem()
        {
            return "+16盔甲";
        }

        protected override string getAccessoriesItem()
        {
            return "+16飾品";
        }
    }
}


2016年3月1日 星期二

工廠方法模式 Factory Pattern

這篇將由第一篇文章簡單工廠模式修改為工廠方法模式

第一篇 : 簡單工廠模式 Simple Factory Pattern

Gashapon.cs
using System;

namespace DesignPattern.FactoryPattern
{
    /*建立一個轉蛋的類別*/
    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 "一般爛虛寶";
        }
    }


    interface IFactory
    {
        Gashapon CreateGashapon();
    }

    class AdvancedFactory : IFactory
    {
        public Gashapon CreateGashapon()
        {
            return new AdvancedItem();
        }
    }

    class GeneralFactory : IFactory
    {
        public Gashapon CreateGashapon()
        {
            return new GeneralItem();
        }
    }

}

主控台

using System;

namespace DesignPattern.FactoryPattern
{
    class Run
    {
        static void Main(string[] args)
        {

            IFactory ghFactory = new AdvancedFactory();
            Gashapon gh = ghFactory.CreateGashapon();
            Console.WriteLine("大於1000元 : " + gh.GetItem());

            ghFactory = new GeneralFactory();
            gh = ghFactory.CreateGashapon();
            Console.WriteLine("小於1000元 : " + gh.GetItem());

            Console.Read();
        }
    }
}


工廠方法克服了簡單工廠違背開放-封閉原則的缺點,又維持了封裝物件建立過程的優點