工厂模式vs简单工厂

前言

  工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

  简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态实例化相关类,对于客户端来说,去除了与具体产品的依赖。例如:计算器,只需要把“+”、“-”等给客户端,然后传入工厂,工厂就自动给出了相应的实例,但问题就这里,如果添加一个“*”的功能,我们一定要给工厂类的方法加‘case’判断的,修改原有的类?这就违背了开-闭原则。

1、公共类

  

 1     /// <summary>
 2     /// 这个人会挣钱,会开公司,男人,女人都要学习
 3     /// </summary>
 4     public class MaYun
 5     {
 6         public void Money()
 7         {
 8             Console.WriteLine("挣钱");
 9         }
10         public void Company()
11         {
12             Console.WriteLine("开公司");
13 
14         }
15     }
1     public class Man : MaYun
2     {
3 
4     }
5     public class Woman : MaYun
6     {
7 
8     }

二、简单工厂

  工厂类:

 1  public class SimpleFactory
 2     {
 3         public static MaYun CreateMaYun(string type)
 4         {
 5             MaYun m = null;
 6             switch (type)
 7             {
 8                 case "Man":
 9                     m = new Man();
10                     break;
11                 case "Woman":
12                     m = new Woman();
13                     break;
14                 default:
15                     break;
16 
17             }
18             return m;
19         }
20     }

  客户端:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             #region 简单工厂
 6             MaYun man1 = SimpleFactory.CreateMaYun("Man");
 7             man1.Money();
 8             man1.Company();
 9             MaYun woman1 = SimpleFactory.CreateMaYun("Woman");
10             woman1.Money();
11             woman1.Company();
12             #endregion
13         }
14     }

三、工厂

  定义工厂接口,并让男人的工厂和女人的工厂类继承该接口

 1  public interface  IFactory
 2     {
 3         MaYun CreateMaYun();
 4     }
 5     public class ManFactory : IFactory
 6     {
 7         public MaYun CreateMaYun()
 8         {
 9             return new Man();
10         }
11     }
12     public class WomanFactory : IFactory
13     {
14         public MaYun CreateMaYun()
15         {
16             return new Woman();
17         }
18     }

  客户端:

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5 
 6             #region 工厂
 7            //要修改为woman,只需修改 IFactory factory = new WoManFactory();
 8             IFactory factory = new ManFactory();
 9             MaYun mm = factory.CreateMaYun();
10             mm.Company();
11             mm.Money();
12             #endregion
13         }
14     }            

总结:

  1、尽管如果换成‘woman类’或者其他子类,还是要修改代码的,但只需要修改一处就可以了。

  2、工厂模式克服了简单工厂违背开-闭原则的缺点,又保持了封装对象创建过程的优点。

  参考书籍:大话设计模式

原文地址:https://www.cnblogs.com/hyunbar/p/9848402.html