zoukankan      html  css  js  c++  java
  • 工厂模式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、工厂模式克服了简单工厂违背开-闭原则的缺点,又保持了封装对象创建过程的优点。

      参考书籍:大话设计模式

  • 相关阅读:
    Xcode11 Developer Tool中没了Application Loader
    iOS
    iOS
    UIView与CALayer的区别,很详细(基础教学拓展)转
    使pre的内容自动换行(转)小知识
    requirejs:模块加载(require)及定义(define)时的路径理解
    JS国际化网站中英文切换(理论支持所有语言)应用于h5版APP
    Tomcat8 配置APR模式
    Mongodb安装
    SecureCRT配色方案
  • 原文地址:https://www.cnblogs.com/hyunbar/p/9848402.html
Copyright © 2011-2022 走看看