设计模式-抽象工厂模式

前言

点击查看:设计模式系列 

如果你对工厂模式这个概念不是很理解,建议:设计模式-简单工厂模式  ,设计模式-工厂方法模式

抽象工厂模式

抽象工厂模式比其它工厂模式更加抽象,抽象工厂模式适用与多个抽象类的情况下,通过工厂返回多个抽象类中你需要得到的具体子类实例。

举例阐述抽象工厂模式:

假如中日爆发钓鱼岛大战(哥哥是和平倡导者,此例完全是为了给大家展示抽象工厂模式):

中国装备:炸弹类,坦克类,来消灭日本。

炸弹类:导弹,核弹;

坦克类:越野车,主站坦克;

战略:

前期中国兵工厂生产:导弹,越野车,打击日本。

后期中国兵工厂生产:核弹,主站坦克,毁灭日本。

类图: 

 

装备类代码:

    #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,数据结构。

 

posted @ 2014-08-20 16:36  张龙豪  阅读(5050)  评论(7编辑  收藏  举报