深入c#工厂模式的详解

 更新时间:2013年05月22日 15:52:55   作者:  
本篇文章是对c#中的工厂模式进行了详细的分析介绍,需要的朋友参考下
什么是工厂模式?
类比生活中的概念,当我们需要打电话的时候,我们需要一部手机,我们通常会选择直接去卖手机的实体店买。但在程序设计中,当我们需要调用一个类(PhoneA或PhoneB)的方法的时候,我们往往还要关心他是怎么new出来的(见代码段1)。这就好比我们自己还要去工厂里面告诉他们你要怎么生产出一部我需要的手机。而我们只关心他能不能打电话,你怎么做的关我屁事。所以这就有了工厂模式。工厂模式其实就是抽象出一个工厂,我需要什么手机,去哪个工厂买就行了。我不必关心他的制作过程,你只要能生产我要的功能的手机就行。所以我们需要引入简单工厂,让我们不用再关心手机怎么生产的,具体代码的实现见代码段2
复制代码 代码如下:

public class Customer
{
    public void CallSomeOne(){
        PhoneA p1 = new PhoneA();
        p1.Call();
    }
}
public class PhoneA
{
    public void Call(){}
}
public class PhoneB
{
    public void Call(){}
}

代码段1 :通常的调用类方法的方式
复制代码 代码如下:

using System;
namespace Example1
{
    public interface IProduct { }
    public class PhoneA : IProduct { }
    public class PhoneB : IProduct { }
    public class Factory
    {
        public IProduct Create()
        {
            // 工厂决定到底实例化哪个子类。
            return new PhonetA ();
        }
    }
}
using System;
namespace Example1
{
    public enum Category
    {
        A,

    }
    public static class ProductFactory
    {
        public static IProduct Create(Category category)
        {
            switch (category)
            {
                case Category.A:
                    return new PhoneA();
                case Category.B:
                    return new PhoneB();
                default:
                    throw new NotSupportedException();
            }
        }
    }
}

代码段2:简单工厂模式的实现
复制代码 代码如下:

[TestMethod]
        public void Test()
        {
            Factory factory = new Factory();
            IProduct phone = factory.Create();   
            Assert.AreEqual<Type>(phone.GetType(), typeof(PhoneA));
        }

代码段3:对简单工厂模式的测试
新的问题
其实刚刚也提到了,我们只要一只能打电话的手机,我就想去实体店买一下,我才不关心是哪个工厂生产的呢~而在简单工厂中,我们还需要关心是哪个工厂生产的(见代码段3)。所以我们在代码里面实现一个实体店,这样我们就不用关心到底是哪个工厂生产的啦。所以我们需要引入抽象工厂,这样我们只需要跟实体店打交道,不要再关心要去找什么工厂拿手机了。具体的实现见代码段4.我们可以利用配置文件实现对工厂的选择,对产品的选择,因为本文不想引入其他的概念,这里就不讨论了。
复制代码 代码如下:

namespace Example2
{
    /// <summary>
    /// 抽象的工厂类型特性描述
    /// </summary>
    public interface IFactory
    {
        IProduct Create();  //  每个工厂所需要具有的工厂方法——创建产品
    }
    /// <summary>
    /// 实体工厂类型
    /// </summary>
    public class FactoryA : IFactory
    {
        public IProduct Create()
        {
            return new PhoneA();
        }
    }
    /// <summary>
    /// 实体工厂类型
    /// </summary>
    public class FactoryB : IFactory
    {
        public IProduct Create()
        {
            return new PhoneB();
        }
    }
}
using System;
using System.Diagnostics;
namespace Example2
{
    class Client
    {
        public void SomeMethod()
        {
            IFactory factory = new FactoryA();   // 获得了抽象Factory的同时,与FactoryA产生依赖;
            IProduct Phone = factory.Create(); // 后续操作仅以来抽象的IFactory和IProduct完成
            // ...
        }
        private IFactory factory;
        public Client(IFactory factory)     // 将IFactory通过Setter方式注入
        {
            if (factory == null) throw new ArgumentNullException("factory");
            this.factory = factory;
        }
        public void AnotherMethod()
        {
            IProduct Phone = factory.Create();
            // ... ...
        }
    }
}

小结
1、工厂方法模式注重的是整体对象的创建方法
2、工厂方法的意图非常明确,它把类的实例化过程延迟到子类,将new()的工作交给工厂 完成。
同时,增加一个抽象的工厂定义,解决一系列具有统一通用工厂方法的实体工厂问题。 在.NET 平台中,我们可以借助配置、泛型和委托的方法在实现经典模式目的的同时,获得工厂类型与客户程序间更加松散的构造过程。

相关文章

  • C#文件操作的简单实例

    C#文件操作的简单实例

    这篇文章主要介绍了C#文件操作的简单实例,需要的朋友可以参考下
    2014-02-02
  • C# 实现特殊字符快速转码

    C# 实现特殊字符快速转码

    这篇文章主要介绍了C# 实现特殊字符快速转码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • C#执行js动态编译的方法

    C#执行js动态编译的方法

    这篇文章主要介绍了C#执行js动态编译的方法,是涉及动态编译脚本非常实用的技巧,需要的朋友可以参考下
    2015-01-01
  • 带你复习c# 托管和非托管资源

    带你复习c# 托管和非托管资源

    这篇文章主要介绍了c# 托管和非托管资源的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 基于WPF编写一个串口转UDP工具

    基于WPF编写一个串口转UDP工具

    串口是设备和上位机通信的常用接口,UDP则是网络通信常用的通信协议,串口和UDP之间的相互转换是非常有意义的。本文就利用WPF编写一个串口转UDP工具,需要的可以参考一下
    2023-04-04
  • c#之事件用法

    c#之事件用法

    这篇文章介绍了c#中事件的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#中DataBindings用法实例分析

    C#中DataBindings用法实例分析

    这篇文章主要介绍了C#中DataBindings用法,结合实例形式详细分析了DataBindings绑定数据源及刷新数据的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C#并发编程之Task类详解

    C#并发编程之Task类详解

    Task是建立在线程池之上的一种多线程技术,它的出现使Thread成为历史。其使用方法非常简单,本文就来通过几个示例为大家讲讲它的具体使用吧
    2023-03-03
  • C# 创建报表过程详解

    C# 创建报表过程详解

    本文给大家介绍的是使用vs2012 c#创建报表的全部过程的记录,十分的详细,有需要的小伙伴可以参考下。
    2015-06-06
  • C#中如何使用 XmlReader 读取XML文件

    C#中如何使用 XmlReader 读取XML文件

    本文介绍了C#中使用XmlReader,只读、向前、循环读取XML节点的方法,并为我们列出、XmlReader类的方法、属性、枚举等成员,希望对大家学习有所帮助。
    2016-05-05

最新评论