使用场景:
在编程中,我们一般会写很多类来描述属性方法等等,当需要使用这个类时,用“new”创建这个类的对象,便可以去使用这个类,但这个对象便会依赖上这个类,每当这个类有改动,对象就要做相应的改动,这就形成了对象与类之间的高耦合,违背了“高内聚,低耦合”的设计标准。这时候使用“简单工厂模式”便可以处理这种情况了。
简单工厂模式咋理解?
在业务处理需要使用类时,不去直接创建这个类的实例对象 (既获取这个类的实例方式不是去直接new这个类),而是通过一个工厂去获取这个类的实例对象,这个工厂就负责来动态创建各种类的实例,当你需要哪个用哪个类时,告诉这个工厂,它会给你创建你需要的实例对象。这样就达到了业务逻辑与类之间的解耦(不明白可以先看下面的demo,再回来看这段话)。
示例:
以一个吃鸡地图欢迎示例,进入不同模式,提示出不同的欢迎语:
1.最简单的方式就是if else:
Console.WriteLine("欢迎来吃鸡啊...");
Console.WriteLine("请选择地图\n 1:海岛模式 \n 2.雨林模式 \n 3.沙漠模式 \n 4.雪地模式");
int num = Convert.ToInt32(Console.ReadLine());
if (num == 1)
Console.WriteLine("欢迎来到海岛地图,加油特种兵...");
else if (num == 2)
Console.WriteLine("欢迎来到雨林地图,加油特种兵...");
else if (num == 3)
Console.WriteLine("欢迎来到沙漠地图,加油特种兵...");
else if (num == 4)
Console.WriteLine("欢迎来到雪地地图,加油特种兵...");
是不是很简单(我以前代码就是这种风格,哈哈,工作需求完成很快,后期迭代更改需求真是头疼)。问题来了,如果加了一个新地图火星地图怎么办?不断加地图怎么办?用上面的逻辑那就是直接改条件,没有ifelse解决不了的逻辑,如果有就再加一行!上面示例只是简单的逻辑,在我们工作开发中,逻辑不可能如此简单,遇到此类问题,每次都是去修改添加条件,如果添加条件有问题,可能导致之前正确运行的逻辑一起挂掉。
2.使用简单工厂模式:
// 模式接口
public interface ICombatMode
{
abstract void SayMode();
}
// 海岛模式
public class Island : ICombatMode
{
public void SayMode()
{
Console.WriteLine("欢迎来到海岛地图,加油特种兵...");
}
}
// 雨林模式
public class RainForest : ICombatMode
{
public void SayMode()
{
Console.WriteLine("欢迎来到雨林地图,加油特种兵...");
}
}
// 沙漠模式
public class Desert : ICombatMode
{
public void SayMode()
{
Console.WriteLine("欢迎来沙漠地图,加油特种兵...");
}
}
//雪地模式
public class Snow : ICombatMode
{
public void SayMode()
{
Console.WriteLine("欢迎来到雪地地图,加油特种兵...");
}
}
// 地图模式工厂
public class ModeFactory
{
// 获取地图模式
public static ICombatMode GetMode(ModeNames type)
{
//这里可以直接通过配置文件来获取使用场景
ICombatMode CombatMode = null;
switch (type)
{
case ModeNames.IsLand:
CombatMode = new Island();
break;
case ModeNames.RainForest:
CombatMode = new RainForest();
break;
case ModeNames.Desert:
CombatMode = new Desert();
break;
case ModeNames.Snow:
CombatMode = new Snow();
break;
default:
throw new Exception("不存在该模式...");
}
return CombatMode;
}
// 枚举所有模式
public enum ModeNames
{
IsLand, RainForest, Desert, Snow
}
}
static void Main(string[] args)
{
Console.WriteLine("欢迎来吃鸡啊...");
Console.WriteLine("请选择地图\n 1:海岛模式 \n 2.雨林模式 \n 3.沙漠模式 \n 4.雪地模式");
int num = Convert.ToInt32(Console.ReadLine());
ICombatMode combatMode = null;
switch (num)
{
case 1:
combatMode = ModeFactory.GetMode(ModeNames.IsLand);
break;
case 2:
combatMode = ModeFactory.GetMode(ModeNames.RainForest);
break;
case 3:
combatMode = ModeFactory.GetMode(ModeNames.Desert);
break;
case 4:
combatMode = ModeFactory.GetMode(ModeNames.Snow);
break;
default:
throw new Exception("不存在该模式....");
}
combatMode.SayMode();
}
以上就是使用简单工厂模式实现的代码,当需要修改添加地图模式只需要去关注修改对应的类即可,不要去修改业务中的代码。
优缺点
简单工厂模式确实是通过工厂动态选择对创建对象,甚至可以设置配置文件,让工厂类根据配置文件中的条件来实现获取对应实例对象 ,让业务逻辑与类之间解耦和。但是工厂与类之间却形成了高耦合,使得工厂类中的逻辑复杂,责任过多,如果工厂类出现了问题,将使得整个系统瘫痪,这就是简单工厂模式一个缺点。