• 定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类,属于创建型模式
  • 在此模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生产具体的产品对象,使一个类的实例化延迟到其子类,由子类来确定实例化哪个具体的产品类。

  1. [TestClass]
  2. public class UnitTest2
  3. {
  4. [TestMethod]
  5. public void TestMethod1()
  6. {
  7. //测试
  8. //当前只是实例化了工厂,工厂的产品还尚未实例化
  9. Creator creator = new ConcreteCreator();
  10. //调用了“工厂方法”后,产品这个对象才真正被实例化
  11. var product = creator.FactoryMethod();
  12. }
  13. }
  14. /// <summary>
  15. /// 产品抽象类 是子类ConcreteProduct的泛华
  16. /// </summary>
  17. public abstract class Product
  18. {
  19. }
  20. /// <summary>
  21. /// 具体的产品 继承自 Product
  22. /// </summary>
  23. public class ConcreteProduct : Product
  24. {
  25. }
  26. /// <summary>
  27. /// 实例化工厂
  28. /// </summary>
  29. public abstract class Creator
  30. {
  31. /// <summary>
  32. /// 定义创建产品对象的公共接口
  33. /// </summary>
  34. /// <returns></returns>
  35. public abstract Product FactoryMethod();
  36. }
  37. public class ConcreteCreator : Creator
  38. {
  39. public override Product FactoryMethod()
  40. {
  41. Console.Write("具体对象的方法");
  42. return new ConcreteProduct();
  43. }
  44. }

案例

调用者只需要通过工厂获取想要的对象,而不需要知道对象的创建具体细节,

参考用例,一家工厂可以生产TV,MP4,MP3等电子产品,这些电子产品都有播放功能。

  1. namespace DesignPatterns.FactoryMethod
  2. {
  3. public class Factory
  4. {
  5. /// <summary>
  6. /// 通过名称决定实例化哪种子类对象
  7. /// </summary>
  8. /// <param name="name">对象名称</param>
  9. /// <returns></returns>
  10. public Product GetProduct(string name)
  11. {
  12. if (name.ToLower() == "tv")
  13. return new TV();
  14. if (name.ToLower() == "mp4")
  15. return new MP4();
  16. if (name.ToLower() == "mp3")
  17. return new MP3();
  18. throw new Exception("unknow product name");
  19. }
  20. public static void Test()
  21. {
  22. var factory = new Factory();
  23. var tv = factory.GetProduct("tv");
  24. tv.Play();
  25. var mp4 = factory.GetProduct("mp4");
  26. mp4.Play();
  27. }
  28. }
  29. public abstract class Product
  30. {
  31. public abstract void Play();
  32. }
  33. public class TV : Product
  34. {
  35. public override void Play()
  36. {
  37. Console.WriteLine("TV play");
  38. }
  39. }
  40. public class MP4 : Product
  41. {
  42. public override void Play()
  43. {
  44. Console.WriteLine("MP4 play");
  45. }
  46. }
  47. public class MP3 : Product
  48. {
  49. public override void Play()
  50. {
  51. Console.WriteLine("MP3 play");
  52. }
  53. }
  54. }

实际运用

在具体的运用场景中比如日志存储方式,有远程TCP,UDP存储,本地磁盘存储,发邮件,这些具体的存储方式,可以通过配置工厂方法中的种类,由调用者选择具体哪种存储方式;

工厂方法只适合统一的对象创建,就是子类和父类拥有相同的构造函数,如果构造函数不一,那么工厂方法将很难管理起这些子类。

查看github源码

Factory Method工厂方法模式的更多相关文章

  1. Factory Method 工厂方法模式

    Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象 ...

  2. Java设计模式:Factory Method(工厂方法)模式

    概念定义 工厂方法(Factory Method)模式,又称多态工厂(Polymorphic Factory)模式或虚拟构造器(Virtual Constructor)模式.工厂方法模式通过定义工厂抽 ...

  3. 设计模式C++学习笔记之五(Factory Method工厂方法模式)

      工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的 ...

  4. 四、Factory Method 工厂方法模式

    需求:对象的创建由工厂统一创建,会使用到模板模式 代码清单: 工厂: public abstract class Factory { public abstract Product createPro ...

  5. 3.Factory Method 工厂方法模式(创建型模式)

    1.定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使得一个类的实例化延迟到子类. 2.实现代码如下: /// <summary> /// 工厂方 ...

  6. 面向对象设计模式纵横谈:Factory Method 工厂方法模式(笔记记录)

    从耦合关系谈起 耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关模块都要随之更改 -模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其 ...

  7. C#面向对象设计模式纵横谈——5.Factory Method 工厂方法模式(创建型模式)

    动机 (Motivation) 在软件系统中,经常面临着“某个对象”的创建工作; 由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何应对这种变化?如何提供一种“封装机制” ...

  8. 设计模式04: Factory Methord 工厂方法模式(创建型模式)

    Factory Methord 工厂方法模式(创建型模式) 从耦合关系谈起耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之变更 -模块与模块之间的 ...

  9. c++ 设计模式8 (Factory Method 工厂方法)

    5. “对象创建”类模式 通过“对象创建”类模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 5.1 工厂方法 动机: ...

随机推荐

  1. HTML之必备meta标签

    meta标签写在HTML的<head>中,推荐每个手机H5页面必加以下的代码: <head> <meta charset="UTF-8"> &l ...

  2. C语言编程入门之--第五章C语言基本运算和表达式-part2

    5.1.4 再来一个C库函数getchar吸收回车键 回车键也是一个字符,在使用scanf的时候,输入完毕要按下回车键,这时候回车键也会被输入到stdin流中,会搞乱我们的程序. 注意:stdin是输 ...

  3. 前端模板引擎doT.js的用法

    简介 一款简单好用的前端模板引擎 用法 <script type="text/javascript" src="js/doT.min.js">< ...

  4. pythonday01计算机初步认识

    1.计算机的初步认识 常见的操作系统: win:xp,win7,win8,win10,windows server linux:centos图形化界面差,ubuntu个人开发,图形界面好,redhat ...

  5. mysql的引擎问题,主键和外键的创建问题,以及创建外键不成功,却创建了一个索引

    mysql的引擎问题: 需要知道的三个引擎:InnoDB--是一个事务处理引擎,不支持全文检索,支持事务操作,即DML操作: Memory--是一个数据存储在内存,速度很快,功能上等同于MyIsam, ...

  6. 【KakaJSON手册】06_Model转JSON

    前面的文章介绍了如何利用KakaJSON进行JSON转Model,从这篇文章开始介绍如何将Model转成JSON 生成JSON和JSONString struct Car: Convertible { ...

  7. Gradle-构建生命周期

    两个重要的概念 项目 实际上,一个项目是什么取决于你要用 Gradle 做什么?项目通常代表的是构建内容. 例如在 Android 中,一个 module 就是一个项目: 项目是注册在 setting ...

  8. 使用BeanShell断言判断请求返回的Json相应结果(不同json格式整理)

    第一种json格式 { "code": 0, "msg": "success", "success": true, &q ...

  9. 合并多个jar包,并通过私服依赖

    背景:许多jar包在maven仓库中没有,项目如果添加了许多的本地jar包,别人拿到代码也无法编译 需求:将本地jar包上传至私服并设置依赖,如果jar包较多,但都从属于同一功能,需要合并为一个jar ...

  10. Nginx+Zuul集群实现高可用网关

    代码参考:https://github.com/HCJ-shadow/Zuul-Gateway-Cluster-Nginx Zuul的路由转发功能 前期准备 搭建Eureka服务注册中心 服务提供者m ...