简单工厂模式

使用场景:

    在编程中,我们一般会写很多类来描述属性方法等等,当需要使用这个类时,用“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();
 }

    以上就是使用简单工厂模式实现的代码,当需要修改添加地图模式只需要去关注修改对应的类即可,不要去修改业务中的代码。

优缺点

    简单工厂模式确实是通过工厂动态选择对创建对象,甚至可以设置配置文件,让工厂类根据配置文件中的条件来实现获取对应实例对象 ,让业务逻辑与类之间解耦和。但是工厂与类之间却形成了高耦合,使得工厂类中的逻辑复杂,责任过多,如果工厂类出现了问题,将使得整个系统瘫痪,这就是简单工厂模式一个缺点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-小龙人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值