当前位置:  编程技术>.net/c#/asp.net

深入c#工厂模式的详解

    来源: 互联网  发布时间:2014-10-21

    本文导语:  什么是工厂模式?类比生活中的概念,当我们需要打电话的时候,我们需要一部手机,我们通常会选择直接去卖手机的实体店买。但在程序设计中,当我们需要调用一个类(PhoneA或PhoneB)的方法的时候,我们往往还要关心他是...

什么是工厂模式?
类比生活中的概念,当我们需要打电话的时候,我们需要一部手机,我们通常会选择直接去卖手机的实体店买。但在程序设计中,当我们需要调用一个类(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(phone.GetType(), typeof(PhoneA));
        }

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

namespace Example2
{
    ///
    /// 抽象的工厂类型特性描述
    ///
    public interface IFactory
    {
        IProduct Create();  //  每个工厂所需要具有的工厂方法——创建产品
    }
    ///
    /// 实体工厂类型
    ///
    public class FactoryA : IFactory
    {
        public IProduct Create()
        {
            return new PhoneA();
        }
    }
    ///
    /// 实体工厂类型
    ///
    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# Func委托的详解
  • C# 多态性的深入理解
  • 深入C#中使用SqlDbType.Xml类型参数的使用详解
  • 深入c# 类和结构的区别总结详解 iis7站长之家
  • 深入Unix时间戳与C# DateTime时间类型互换的详解
  • C# interface与delegate效能比较的深入解析
  • C#中IList<T>与List<T>的区别深入解析
  • 深入分析C#中WinForm控件之Dock顺序调整的详解
  • C#中静态的深入理解
  • C#泛型约束的深入理解
  • C#之CLR内存深入分析
  • 深入解析c#中枚举类型的定义与使用
  • 深入c#绘制验证码的详解
  • 深入c# 类和结构的区别总结详解
  • 深入c# GDI+简单绘图的具体操作步骤(一)
  • 深入探讨C#中的结构struct
  • 深入理解C# abstract和virtual关键字
  • c#方法中调用参数的值传递方式和引用传递方式以及ref与out的区别深入解析
  • 深入JDBC sqlserver连接写法的详解
  • 深入mysql YEAR() MONTH() DAYOFMONTH()日期函数的详解
  • 深入SQLServer中ISNULL与NULLIF的使用详解
  • 深入C++可见性与生命期的区别详解
  • 深入mysql并发插入优化详解
  • 深入android Unable to resolve target 'android-XX'详解
  • 深入MYSQL字符数字转换的详解
  • 深入SQL Server中定长char(n)与变长varchar(n)的区别详解
  • 深入Windows下的回车是回车换行(rn)还是换行回车(nr)的详解
  • 深入分析NTFS中文件被锁定导致Process.Start失败的详解
  • 深入分析Java内存区域的使用详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Docker支持更深入的容器日志分析
  • 关于《深入浅出MFC》
  • Linux有没有什么好的高级的书,我要深入,
  • 深入理解linux内核
  • [100分]有没有关于binutils的深入的资料?或者深入底层的资料?
  • 深入理解PHP内核 TIPI
  • 想深入学习Java应该学习哪些东西
  • 哪位有《JSP深入编程》电子版?
  • 想要深入学习LINUX该学什么?
  • 100分求:哪儿有《深入理解linux内核》可供下哉!
  • 如何深入Linux的内核学习?
  • U-BOOT得掌握到什么程序,用不用深入去学
  • 想深入了解操作系统该怎么做
  • 前一阵子学习了shell脚本,如果想深入点了解linux可以看什么书呢
  • 问一个《深入理解计算机系统》中的问题
  • 深入多线程之:深入分析Interlocked
  • ##想买书深入学习linux下的编程,请指教
  • 深入oracle特定信息排序的分析
  • 深入分析C中不安全的sprintf与strcpy
  • 哪儿有下载《深入理解Linux内核》这本书?(中文)
  • 请问JFC是否有必要深入研究?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3