設計模式-抽象工廠模式

葉少磐發表於2019-04-12

前言

點選檢視:設計模式系列 

如果你對工廠模式這個概念不是很理解,建議:設計模式-簡單工廠模式  ,設計模式-工廠方法模式

抽象工廠模式

抽象工廠模式比其它工廠模式更加抽象,抽象工廠模式適用與多個抽象類的情況下,通過工廠返回多個抽象類中你需要得到的具體子類例項。

舉例闡述抽象工廠模式:

假如中日爆發釣魚島大戰(哥哥是和平倡導者,此例完全是為了給大家展示抽象工廠模式):

中國裝備:炸彈類,坦克類,來消滅日本。

炸彈類:導彈,核彈;

坦克類:越野車,主站坦克;

戰略:

前期中國兵工廠生產:導彈,越野車,打擊日本。

後期中國兵工廠生產:核彈,主站坦克,毀滅日本。

類圖: 

 

裝備類程式碼:

    #region 炸彈系列
    abstract class Bomb
    {
        abstract public void baozha();
    }
    /// <summary>
    /// 導彈
    /// </summary>
    class daodanBomb :Bomb
    {
        public override void baozha()
        {
            Console.WriteLine("我是一顆中國造導彈,來轟炸不老實的小日本!");
        }
    }
    /// <summary>
    /// 核彈
    /// </summary>
    class hedanBomb : Bomb
    {
        public override void baozha()
        {
            Console.WriteLine("我是一顆中國造核彈,來轟炸不老實的小日本!");
        }
    }
    #endregion

    #region 坦克系列
    abstract class Tank
    {
        abstract public void go();
    }
    /// <summary>
    /// 越野車
    /// </summary>
    class yueyeTank : Tank
    {
        public override void go()
        {
            Console.WriteLine("我是一顆中國造越野車,來踏平不老實的小日本!");
        }
    }
    /// <summary>
    /// 主站坦克
    /// </summary>
    class zhuzhanTank : Tank
    {
        public override void go()
        {
            Console.WriteLine("我是一顆中國造主站坦克,來踏平不老實的小日本!");
        }
    }
    #endregion

工廠類程式碼

    #region 中國兵工廠
    abstract class chinaFactory
    {
        //裝甲車製造車間
        public abstract Tank CreateTank();
        //炸彈知道車間
        public abstract Bomb CreateBomb();
    }
    //兵工廠前期製造
    class qianqiFactory : chinaFactory
    {      
        public override Bomb CreateBomb()
        {
            //導彈
            return new daodanBomb();
        }
        public override Tank CreateTank()
        {
            //越野車
            return new yueyeTank();
        }
    }
    //兵工廠後期製造
    class houqiFactory : chinaFactory
    {
        public override Bomb CreateBomb()
        {
            //核彈
            return new hedanBomb();
        }
        public override Tank CreateTank()
        {
            //主站坦克
            return new zhuzhanTank();
        }
    }
    #endregion

客戶端程式碼:(打仗)

    // 備戰
    class Make
    {
        //裝備 
        private Bomb bomb;
        private Tank tank;
        //製造加工
        public Make(chinaFactory factory)
        {
            bomb = factory.CreateBomb();
            tank = factory.CreateTank();
        }

        //開始打仗
        public void warStar()
        {
            //炸彈類爆炸
            bomb.baozha();
            //戰車類前進
            tank.go();
        }

    }
    public class start
    {
        public static void Main()
        {
            //大戰前期
            chinaFactory qianqiMake = new qianqiFactory();
            Make qianqi = new Make(qianqiMake);
            qianqi.warStar();

            //點任意鍵,進行後期攻勢!!
            Console.ReadKey();

            //大戰後期
            chinaFactory houqiMake = new houqiFactory();
            Make houqi = new Make(houqiMake);
            houqi.warStar();

            Console.WriteLine("釣魚島是中國的,神聖不可侵犯!小日本,滾開!!");
            Console.ReadLine();
        }
    }

大戰結束,總結抽象工廠模式

由於戰爭的不可預料性,與權威的體現不可朝令夕改,恰恰體現出啦此模式的好處,因為,戰備物資部可以隨意的新增新的武器,如在炸彈類中新增反物質炸彈,只用在前期或者後期工廠中新增一個方法即可,客戶端戰場方面不用改變,可按部就班,依照從前的形式做戰。

抽象工廠模式的主要目的之一是隔離所生成的具體類,這些類被隱藏在工廠內部,完全不需要客戶端知道。因為類被隔離,所以產品類系列可以隨意改變或是交換。

具體好處還需自己體會抽象工廠模式的體系。

歡迎加入部落格左上方群,交流探討,設計模式,資料庫,c#.net,資料結構。

 

相關文章