设计模式:抽象工厂

先这里给大家分享一个学习设计模式好的网站:https://refactoring.guru/

意图:

  • 抽象工厂是一种创新的设计模式,可让您生成相关对象的族而无需指定其具体类。 

利弊: 

  • 客户无需知道具体产品如何创建,解耦
  • 符合单一职责原则
  • 符合开闭原则,对拓展开放
  • 随着拓展的增多,会使代码变得复杂,增加了新的接口和类

下面来举例子说下这个设计模式: 

    现在想建造一个我们人类的生存环境的模型。这个模型包括了公路Road,建筑Building,丛林Jungle等等。我们把它们三个叫做同一族的产品。这里就会出现一个变化,这个模型可以表现出来现代的生存环境又或者是古代的生存环境,很显然这两种生存环境下三个产品的外观是不同的。古代的建筑物是茅草房,公路是泥巴路等等,现代的生存环境建筑物是高楼大厦,公路是水泥路等等。若是使用工厂方法,我们会根据生存环境划分至少会产生以下几个类:ModernRoadFactory,ModernBuildingFactory,ModernJungleFactory,OldRoadFactory,OldBuildingFactory,OldJungleFactory。每个产品对应都有现代的和古代的风格。这样一来就会就会加大我们代码的复杂程度。说完他的变化了,再根据他的变化来说说这种设计模式。贴上代码:

 #region 产品族的抽象类
    abstract class Road
    {

    }

    abstract class Building
    {

    }

    abstract class Jungle
    {

    }
    #endregion

    #region 产品族的具体实现
    class ModernRoad : Road { }
    class WaterRoed : Road { }
    class ModernBuilding : Building { }
    class ModernJungle : Jungle { }
    #endregion

    #region 抽象工厂类
    abstract class FacilitiesFactory
    {
        public abstract Road CreateRoad();
        public abstract Building CreateBuilding();
        public abstract Jungle CreateJungle();
    }
    #endregion

    #region 具体工厂类
    class ModernFacilitiesFacorr : FacilitiesFactory
    {
        public override Building CreateBuilding()
        {
            return new ModernBuilding();
        }

        public override Jungle CreateJungle()
        {
            return new ModernJungle();
        }

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


    //客户程序
    class GameManager
    {
        FacilitiesFactory facilitiesFactory;
        Road road;
        Building building;
        Jungle jungle;
        public GameManager(FacilitiesFactory facilitiesFactory)
        {
            this.facilitiesFactory = facilitiesFactory;
        }

        public void BuildingFacilities()
        {
            road = facilitiesFactory.CreateRoad();
            building = facilitiesFactory.CreateBuilding();
            jungle = facilitiesFactory.CreateJungle();
        }

        public void Run()
        {
            //todo 根据具体情况的逻辑来
        }
    }

 

 由上述代码抽象工厂模式将Road,Building,jungle这几个产品(注意他们需要是同一族)放在了同一个工厂,这样一来一个工厂不再只能生产一个产品了,减少了代码的复杂程度。若是想表现古代生存环境,只需要提供具体产品的实现类,和一个古代工厂就行了

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值