专栏首页GreenLeavesFactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • FactoryMethod工厂方法模式(创建型模式)

    整个抽象的游戏设施建造系统相对变化较慢,本例中只有一个Build的创建方法,而Build内部的方法实现,该实现依赖与各种具体的实现,而这些实现变化的非常频繁,现...

    郑小超.
  • Decorator装饰者模式(结构型模式)

    假设让我们去设计FCL中的Stream类,该类具有流类的基本功能,除了有各种不同类型的流外(如内存流、文件流、网络流等等),但是在不同的业务场景下,如处理银行业...

    郑小超.
  • C# Command命令(行为型模式)+队列 实现事务,带异步命令重试机制和生命周期

    耦合是软件不能抵御变变化的根本性原因,不仅实体对象与实体对象之间有耦合关系(如创建性设计模式存在的原因),对象和行为之间也存在耦合关系.

    郑小超.
  • 依赖注入容器-- Autofac

    Autofac---Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高...

    小世界的野孩子
  • Java面向对象之抽象类,接口

    抽象类: 含有抽象方法的类被声明为抽象类 抽象方法由子类去实现 含有抽象方法的类必须被声明为抽象类 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中...

    二十三年蝉
  • IOC编程

    2. 开放/封闭原则: 添加任何新行为,应该是扩展到新类中,而不应该直接修改原来运行良好的代码。

    小蜜蜂
  • 通过简单代码示例了解七大软件设计原则

    本文档设计源码地址:https://gitee.com/daijiyong/SoftwareDesignPrinciples

    你好戴先生
  • 23种设计模式详解(三)

    南风
  • 设计模式 接口隔离原则

    接着,要进行更改了。对好看的定义,发生了改变,那么就应该改变PettyGirl中的内容,但是已经在接口中定义了。那么就有问题了。即,接口承担的内容过多导致

    mySoul
  • Unity Inspector面板常用的属性

    其它还有诸如 HelpURL 等,详情可参考 官方帮忙文档 https://docs.unity3d.com/ScriptReference/HeaderAtt...

    meteoric

扫码关注云+社区

领取腾讯云代金券