深入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#加载嵌入到资源的非托管dll

    C#加载嵌入到资源的非托管dll

    很多朋友遇到过这样一个问题需要加载非win32的非托管dll,纠结该怎么操作呢,下面通过代码给大家介绍下C#加载嵌入到资源的非托管dll的方法,感兴趣的朋友一起看看吧
    2021-05-05
  • C# 嵌入dll 的方法

    C# 嵌入dll 的方法

    这篇文章主要介绍了C# 嵌入dll 的方法,本文图文并茂给大家及时的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • C#文字识别API场景解析、表格识别提取功能实现

    C#文字识别API场景解析、表格识别提取功能实现

    文章介绍了基于深度学习算法和自主OCR核心技术提供的文字识别API,该API能够适应各种复杂场景,高效、精准地识别印刷体和手写体文字,并支持批量识别,文章以身份证识别接口为例,介绍C#文字识别API场景解析、表格识别提取功能,感兴趣的朋友一起看看吧
    2024-11-11
  • C#网络请求与JSON解析的示例代码

    C#网络请求与JSON解析的示例代码

    这篇文章主要介绍了C#网络请求与JSON解析的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • C#实现对用户输入数据进行校验的类实例

    C#实现对用户输入数据进行校验的类实例

    这篇文章主要介绍了C#实现对用户输入数据进行校验的类,实例分析了C#针对各种用户输入数据的常用校验技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • C#实现三元组的使用示例

    C#实现三元组的使用示例

    本文介绍了C#中的三元组数据结构,以及如何使用三元组在C#中进行一些特定的计算,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • C#实现快捷键的几种常用方法汇总

    C#实现快捷键的几种常用方法汇总

    这篇文章主要介绍了C#实现快捷键的几种常用方法,非常实用,需要的朋友可以参考下
    2014-08-08
  • C# WinForms中实现MD5的加密

    C# WinForms中实现MD5的加密

    MD5(消息摘要算法第5版)是一种广泛使用的哈希函数,可以生成一个128位(16字节)的哈希值,通常用于数据完整性校验和密码存储,在Windows Forms应用程序中实现MD5加密,可以用于用户密码的安全存储和数据的完整性验证,本文将详细介绍了如何在WinForms中实现MD5加密
    2024-10-10
  • 在C# WPF下自定义滚动条ScrollViewer样式的操作

    在C# WPF下自定义滚动条ScrollViewer样式的操作

    这篇文章主要介绍了在C# WPF下自定义滚动条ScrollViewer样式的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • http图片上传安全性问题 根据ContentType (MIME) 判断其实不准确、不安全

    http图片上传安全性问题 根据ContentType (MIME) 判断其实不准确、不安全

    图片上传常用的类型判断方法有这么几种---截取扩展名、获取文件ContentType (MIME) 、读取byte来判断(这个什么叫法来着?)。下面由脚本之家小编跟大家分享图片上传安全性问题,感兴趣的朋友一起看看吧
    2015-09-09

最新评论