先这里给大家分享一个学习设计模式好的网站: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这几个产品(注意他们需要是同一族)放在了同一个工厂,这样一来一个工厂不再只能生产一个产品了,减少了代码的复杂程度。若是想表现古代生存环境,只需要提供具体产品的实现类,和一个古代工厂就行了