前言

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

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

1、公共类

  

     /// <summary>
/// 这个人会挣钱,会开公司,男人,女人都要学习
/// </summary>
public class MaYun
{
public void Money()
{
Console.WriteLine("挣钱");
}
public void Company()
{
Console.WriteLine("开公司"); }
}
     public class Man : MaYun
{ }
public class Woman : MaYun
{ }

二、简单工厂

  工厂类:

  public class SimpleFactory
{
public static MaYun CreateMaYun(string type)
{
MaYun m = null;
switch (type)
{
case "Man":
m = new Man();
break;
case "Woman":
m = new Woman();
break;
default:
break; }
return m;
}
}

  客户端:

     class Program
{
static void Main(string[] args)
{
#region 简单工厂
MaYun man1 = SimpleFactory.CreateMaYun("Man");
man1.Money();
man1.Company();
MaYun woman1 = SimpleFactory.CreateMaYun("Woman");
woman1.Money();
woman1.Company();
#endregion
}
}

三、工厂

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

  public interface  IFactory
{
MaYun CreateMaYun();
}
public class ManFactory : IFactory
{
public MaYun CreateMaYun()
{
return new Man();
}
}
public class WomanFactory : IFactory
{
public MaYun CreateMaYun()
{
return new Woman();
}
}

  客户端:

     class Program
{
static void Main(string[] args)
{ #region 工厂
//要修改为woman,只需修改 IFactory factory = new WoManFactory();
IFactory factory = new ManFactory();
MaYun mm = factory.CreateMaYun();
mm.Company();
mm.Money();
#endregion
}
}

总结:

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

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

  参考书籍:大话设计模式

最新文章

  1. 替换url中某个参数的值或是添加某个参数的方法(js 分页上下页可以使用)
  2. HTML5本地存储 Web Storage
  3. oracle本机登录不上dba的权限不足错误
  4. [最近公共祖先] POJ 1330 Nearest Common Ancestors
  5. netbeans项目中排除node_modules文件夹
  6. OpenCV学习笔记——多种Smooth平滑处理
  7. SqlSever基础 len函数 返回一个字符串的长度
  8. javascript 10进制和64进制的转换
  9. HtmlWebpackPlugin实现资源的自定义插入
  10. swift 学习之自动引用计数
  11. [LeetCode] 22. 括号生成
  12. 发布python模块
  13. Architectural principles
  14. Java15-java语法基础(十五)——内部类
  15. Oracle11g的database 和client的区别是什么?
  16. STL其他--&lt;tuple&gt;用法【C11】
  17. postman学习笔记(二)
  18. Linux/CentOS关闭图形界面(X-window)和启用图形界面命令
  19. 开始使用ARC
  20. 洛谷P4424 寻宝游戏 [HNOI/AHOI2018]

热门文章

  1. lLinux的常用命令
  2. ASE Beta Sprint - backend scrum 4
  3. FM
  4. idea中ehcahe配置中 Cannot find the declaration of element &#39;ehcache&#39;.
  5. 剖析 Vue.js 内部运行机制 (1)
  6. Thinkphp 请求和响应
  7. python数据库操作-mysql数据库
  8. 三星GT S7562 PIN 解锁方法
  9. easyui加载json菜单的相关代码
  10. Listary安装+破解