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

   [TestClass]
public class UnitTest2
{
[TestMethod]
public void TestMethod1()
{
//测试
//当前只是实例化了工厂,工厂的产品还尚未实例化
Creator creator = new ConcreteCreator();
//调用了“工厂方法”后,产品这个对象才真正被实例化
var product = creator.FactoryMethod();
}
} /// <summary>
/// 产品抽象类 是子类ConcreteProduct的泛华
/// </summary>
public abstract class Product
{ } /// <summary>
/// 具体的产品 继承自 Product
/// </summary>
public class ConcreteProduct : Product
{ } /// <summary>
/// 实例化工厂
/// </summary>
public abstract class Creator
{
/// <summary>
/// 定义创建产品对象的公共接口
/// </summary>
/// <returns></returns>
public abstract Product FactoryMethod();
} public class ConcreteCreator : Creator
{
public override Product FactoryMethod()
{
Console.Write("具体对象的方法");
return new ConcreteProduct();
}
}

案例

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

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

 namespace DesignPatterns.FactoryMethod
{
public class Factory
{
/// <summary>
/// 通过名称决定实例化哪种子类对象
/// </summary>
/// <param name="name">对象名称</param>
/// <returns></returns>
public Product GetProduct(string name)
{
if (name.ToLower() == "tv")
return new TV();
if (name.ToLower() == "mp4")
return new MP4();
if (name.ToLower() == "mp3")
return new MP3();
throw new Exception("unknow product name");
} public static void Test()
{
var factory = new Factory();
var tv = factory.GetProduct("tv");
tv.Play();
var mp4 = factory.GetProduct("mp4");
mp4.Play();
}
} public abstract class Product
{
public abstract void Play();
} public class TV : Product
{
public override void Play()
{
Console.WriteLine("TV play");
}
} public class MP4 : Product
{
public override void Play()
{
Console.WriteLine("MP4 play");
}
} public class MP3 : Product
{
public override void Play()
{
Console.WriteLine("MP3 play");
}
}
}

实际运用

在具体的运用场景中比如日志存储方式,有远程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. java多线程中wait/notify/sleep/join/yield方法以及多线程的六种状态

    刚开始学线程的时候也是被这几个方法搞的云里雾里的,尤其是一开始看的毕老师的视频,老师一直在强调执行权和执行资格,看的有点懵逼,当然不是说毕老师讲的不好,就是自己有点没听明白,后来复习看了一些其他的博客 ...

  2. Sentry错误日志监控你会用了吗?

    无论作为新手还是老手程序员在程序的开发过程中,代码运行时难免会抛出异常,而且项目在部署到测试.生产环境后,我们便不可能像在开发时那样容易的及时发现处理错误了.一般我们都是在错误发生一段时间后,错误信息 ...

  3. 入门MySQL——查询语法练习

    前言: 前面几篇文章为大家介绍了DML以及DDL语句的使用方法,本篇文章将主要讲述常用的查询语法.其实MySQL官网给出了多个示例数据库供大家实用查询,下面我们以最常用的员工示例数据库为准,详细介绍各 ...

  4. pringboot pom文件引入本地jar包和对其打jar包

    maven引入本地jar包需要在pom文件中天剑如下配置: <dependency> <groupId>com.baidu</groupId> <artifa ...

  5. LiteORM-For-DotNet,我的第一个开源库

    这是一个DotNet轻量级ORM框架,解决C#.Net开发过程中重复繁琐的数据库CURD操作. 前言 因工作中接手的.net项目,源码里面都用了动软代码生成的源码做为数据库操作类库.其中,有些根本就没 ...

  6. Condition控制线程通信

    Condition控制线程通信 一.前言 java.util.concurrent.locks.Condition 接口描述了可能会与锁有关联的条件变量.这些变量在用法上与使用Object.wait ...

  7. mysql where、group by、having

    今天重新温习一遍mysql的知识 先来讲讲where.group by.having group by :是将记录中的数据,按照条件进行分组: having:是将分组后的数据加上条件筛选,区别于whe ...

  8. 【原创】(二)Linux物理内存初始化

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  9. JVM宏观认知&&内存结构

    JVM宏观认知 1.什么是虚拟机? 虚拟机是一种软件. 可分为系统虚拟机(仿真物理机)和程序虚拟机(执行单个计算机程序,比如JVM). 2.什么是Java虚拟机(JVM)? JVM是一种将字节码转化为 ...

  10. Mac添加中国法定节假日安排

    最近中秋.国庆临近,当大家开始抢票才反应过来,原来假日已然临近,打开mac日历,发现并没有标注节假日安排,发现了这篇文章,写了这篇读后感. 上面的文章介绍使用了两种在苹果系列设备设置中国节假日的方式: ...