zoukankan      html  css  js  c++  java
  • 设计模式-抽象工厂模式

    前言

    点击查看:设计模式系列 

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

    抽象工厂模式

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

    举例阐述抽象工厂模式:

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

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

    炸弹类:导弹,核弹;

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

    战略:

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

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

    类图: 

    装备类代码:

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

  • 相关阅读:
    使用nodejs运行SAP Fiori应用
    JUnit 注解@Rule的工作原理
    JUnit 注解@SuiteClasses的工作原理
    JUnit 注解@Category的工作原理
    JUnit 注解@RunWith的工作原理
    Eclipse里如果看不到Attach Source按钮应该怎么办
    使用SAP CRM中间件从ERP下载BOM的一些常见问题
    GaussDB(DWS):非侵入式备份及其在NBU上的应用
    华为云原生数据仓库GaussDB(DWS)深度技术解读:融、快、大、稳、易
    华为云举办AI经典论文复现活动,打造领先AI开发者学习社区
  • 原文地址:https://www.cnblogs.com/knowledgesea/p/3924939.html
Copyright © 2011-2022 走看看