首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式

FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式

作者头像
郑小超.
发布2018-10-18 11:03:43
3690
发布2018-10-18 11:03:43
举报
文章被收录于专栏:GreenLeavesGreenLeavesGreenLeaves

具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详细原理介绍.

1、在FactoryMethod工厂方法模式(创建型模式)的基础上,提出了一个代码上的需求,需要对前面的风格进行抽象,将相同风格的道路和房屋工厂类型进行抽象,这就是抽象工厂,代码如下:

    #region 抽象工厂
    ///// <summary>
    ///// 抽象的游戏建造系统
    ///// </summary>
    public class BuildSystem
    {
        /// <summary>
        /// 具体的构建方法,Build方法的逻辑变化较慢(只需要创建2种风格的房屋和道路,总共8个对象),但是风格变化较快,由于需求变化,可能需要创建诸如卡通风格、另类风格等的房屋和道路
        /// </summary>
        public void Build(CartoonFactory cartoonFactory, AlternativeFactory alternativeFactory)
        {
            House HFirstStyleOne = cartoonFactory.CreateHouse();
            Console.WriteLine(HFirstStyleOne.ShowHouseStyle());
            House HFirstStyleTwo = cartoonFactory.CreateHouse();
            Console.WriteLine(HFirstStyleTwo.ShowHouseStyle());
            Road RFirstStyleOne = cartoonFactory.CreateRoad();
            Console.WriteLine(RFirstStyleOne.ShowRoadStyle());
            Road RFirstStyleTwo = cartoonFactory.CreateRoad();
            Console.WriteLine(RFirstStyleTwo.ShowRoadStyle());
            House HSecondStyleOne = alternativeFactory.CreateHouse();
            Console.WriteLine(HSecondStyleOne.ShowHouseStyle());
            House HSecondStyleTwo = alternativeFactory.CreateHouse();
            Console.WriteLine(HSecondStyleTwo.ShowHouseStyle());
            Road RSecondStyleOne = alternativeFactory.CreateRoad();
            Console.WriteLine(RSecondStyleOne.ShowRoadStyle());
            Road RSecondTwo = alternativeFactory.CreateRoad();
            Console.WriteLine(RSecondTwo.ShowRoadStyle());
        }
    }

    #region 抽象
    public abstract class House
    {
        public abstract string ShowHouseStyle();
    }

    public abstract class Road
    {
        public abstract string ShowRoadStyle();
    }

    #endregion

    #region 抽象工厂
    public abstract class AbstractFactory
    {
        public abstract House CreateHouse();

        public abstract Road CreateRoad();
    }
    #endregion

    #region 具体抽象工厂-负责系列对象的创建
    public class ModernFactory : AbstractFactory
    {
        public override House CreateHouse()
        {
            return new ModernHouse();
        }

        public override Road CreateRoad()
        {
            return new ModernRoad();
        }
    }

    public class ClassicalFactory : AbstractFactory
    {
        public override House CreateHouse()
        {
            return new ClassicalHouse();
        }

        public override Road CreateRoad()
        {
            return new ClassicalRoad();
        }
    }

    public class CartoonFactory : AbstractFactory
    {
        public override House CreateHouse()
        {
            return new CartoonHouse();
        }

        public override Road CreateRoad()
        {
            return new CartoonRoad();
        }
    }

    public class AlternativeFactory : AbstractFactory
    {
        public override House CreateHouse()
        {
            return new AlternativeHouse();
        }

        public override Road CreateRoad()
        {
            return new AlternativeRoad();
        }
    }
    #endregion

    #region 具体的实现
    public class ModernHouse : House
    {
        public override string ShowHouseStyle()
        {
            return "Modern现代化风格房屋";
        }
    }

    public class ModernRoad : Road
    {
        public override string ShowRoadStyle()
        {
            return "Modern现代化风格道路";
        }
    }

    public class ClassicalHouse : House
    {
        public override string ShowHouseStyle()
        {
            return "Classical古典化风格房屋";
        }
    }

    public class ClassicalRoad : Road
    {
        public override string ShowRoadStyle()
        {
            return "Classical古典化风格道路";
        }
    }

    public class CartoonHouse : House
    {
        public override string ShowHouseStyle()
        {
            return "Cartoon卡通化风格房屋";
        }
    }

    public class CartoonRoad : Road
    {
        public override string ShowRoadStyle()
        {
            return "Cartoon卡通化风格道路";
        }
    }

    public class AlternativeHouse : House
    {
        public override string ShowHouseStyle()
        {
            return "Alternative另类化风格房屋";
        }
    }

    public class AlternativeRoad : Road
    {
        public override string ShowRoadStyle()
        {
            return "Alternative另类化风格道路";
        }
    }
    #endregion 

    #endregion

客户端调用代码如下:

        static void Main(string[] args)
        {
            #region 抽象工厂
            BuildSystem buildSystem = new BuildSystem();
            buildSystem.Build(new CartoonFactory(), new AlternativeFactory());
            #endregion

            Console.ReadKey();
        }

ok,根据输出可以发现,输出可以发现,抽象工厂也可以很好的解决提出的需求,而且,对工厂模式中的工厂类进行抽象,减少了工厂类.提供了代码的扩展性和可读性的同时,精简了代码,如果想继续减少工厂类,让代码保持前面的优势的同时,精简代码请参考:原型模式(创建型模式)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档