`
北极的。鱼
  • 浏览: 159045 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】.NET设计模式(2): 工厂方法模式

阅读更多

转自:http://www.cnblogs.com/anlyren/archive/2008/01/26/factory_method.html

 工厂方法模式(Factory Method Pattern)

介绍:
简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式。它解决的仍然是软件设计中与创建对象有关的问题。它可以更好的处理客户的需求变化。

引入
我们继续来说"new"的问题,我们在简单工厂模式中,将实例化对象的工作推迟到了专门负责创建对象的工厂类中,这样,在我们事先预知的情况下,可以根据我们的需要动态创建产品类。但是,我们的预知是有限的,客户的变化可能是无限的。所以,就出现了问题,一旦客户的变化超越了我们的预知,我们就必须修改我们的源代码了。这是设计模式所不允许的,怎么办呢?工厂方法模式正是解决此类问题的。
问题:具体工厂类的创建工作不能满足我们的要求了,创建的工作变化了
解决思路:哪里变化,封装哪里。把具体工厂封装起来。

定义
工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂模式(Polymorphic Factory),在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化(创建)哪一个类。

意图
定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。

参与者

  • 抽象产品角色(Product)
    定义产品的接口
  • 具体产品角色(ConcreteProduct)
    实现接口Product的具体产品类
  • 抽象工厂角色(Creator)
    声明工厂方法(FactoryMethod),返回一个产品
  • 真实的工厂(ConcreteCreator)
    实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例

工厂方法模式UML图
工厂方法模式(Factory Method Pattern)

介绍:
简单工厂模式中,我们提到,工厂方法模式是简单工厂模式的一个延伸,它属于Gof23中设计模式的创建型设计模式。它解决的仍然是软件设计中与创建对象有关的问题。它可以更好的处理客户的需求变化。

引入
我们继续来说"new"的问题,我们在简单工厂模式中,将实例化对象的工作推迟到了专门负责创建对象的工厂类中,这样,在我们事先预知的情况下,可以根据我们的需要动态创建产品类。但是,我们的预知是有限的,客户的变化可能是无限的。所以,就出现了问题,一旦客户的变化超越了我们的预知,我们就必须修改我们的源代码了。这是设计模式所不允许的,怎么办呢?工厂方法模式正是解决此类问题的。
问题:具体工厂类的创建工作不能满足我们的要求了,创建的工作变化了
解决思路:哪里变化,封装哪里。把具体工厂封装起来。

定义
工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂模式(Polymorphic Factory),在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化(创建)哪一个类。

意图
定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。

参与者

  • 抽象产品角色(Product)
    定义产品的接口
  • 具体产品角色(ConcreteProduct)
    实现接口Product的具体产品类
  • 抽象工厂角色(Creator)
    声明工厂方法(FactoryMethod),返回一个产品
  • 真实的工厂(ConcreteCreator)
    实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例

工厂方法模式UML图


 现实生活中的例子
为了方便大家理解,我仍然举穿衣服方面的一个例子。这个例子与简单工厂模式中的那个例子有些不同。
据说清朝有个皇帝穿衣非常的奢侈,每种衣服(具体产品类)由一宫女(具体工厂类)专门负责,这样一来,每增加一种衣服(具体产品类),就要多出一个宫女(具体工厂类),但是他们各负其责,互不影响。皇帝之所以这样做,是因为针对穿衣服这件事来说,可扩展性是非常强的()。

分析
实现的功能:可以根据皇帝的要求,动态的创建(由宫女去拿)已存在的具体产品(衣服),如果皇帝的要求太苛刻,这种衣服还没有,只需要增加一个宫女,一个衣服就能够满足他的要求了。每个宫女只负责一种衣服(高内聚),要增加一种衣服,对于以前的所有宫女与衣服来说,都不会受到影响(设计模式中所期望的)。说到这里,是不是明白了工厂方法模式所能解决的问题及其应用了?呵呵。。你一定在想,比简单工厂模式灵活性高吧。。

抽象工厂角色代码

/// <summary>
/// 抽象工厂类,定义产品的接口
/// </summary>
public interface IFactory
{
    ICoat CreateCoat();
}

/// <summary>
/// 抽象产品类
/// </summary>
public interface ICoat
{
    void ShowCoat();
}

/**/
/// <summary>
/// 具体工厂类:用于创建商务上衣类
/// </summary>
public class BusinessFactory : IFactory
{
    public ICoat CreateCoat()
    {
        return new BusinessCoat();
    }
}

/**/
/// <summary>
/// 具体工厂类,用于创建时尚上衣
/// </summary>
public class FashionFactory : IFactory
{
    public ICoat CreateCoat()
    {
        return new FashionCoat();
    }
}

/// <summary>
/// 具体产品类,商务上衣类
/// </summary>
public class BusinessCoat : ICoat
{
    public void ShowCoat()
    {
        Console.WriteLine("这件是商务上衣");
    }
}

/**/
/// <summary>
/// 具体产品类,时尚上衣类
/// </summary>
public class FashionCoat : ICoat
{
    public void ShowCoat()
    {
        Console.WriteLine("这件是时尚上衣");
    }
}

/**/
/// <summary>
/// 客户端代码
/// </summary>
class Client
{
    static void Main(string[] args)
    {
        //为了方便以后修改,将工厂类的类名写在应用程序配置文件中
        string factoryName = ConfigurationManager.AppSettings["FactoryName"];

        IFactory factory = (IFactory)Assembly.Load("ConcreteFactory").CreateInstance("FactoryMethod." + factoryName);

        ICoat coat = factory.CreateCoat();
        //显示你要的上衣
        coat.ShowCoat();
    }
}

 

客户端代码需要注意的两个地方:
1,把具体工厂类类名称写在了应用程序配置文件中,方便修改
2,用到了反射,利用.NET提供的反射可以根据类名来创建它的实例,非常方便


由反射想到的:
下面这一段内容不是计划要写的。
如果在具体工厂中,每次new的对象都是一个,而且这些类是继承自抽象产品接口的,那么我们用简单工厂模式也可以实现动态的增加具体产品类。这样来做,在简单工厂模式中最核心的部分----工厂类不要根据传来的条件去动态创建产品类,利用反射机制去创建。把要实例化的类名放在应用程序配置文件中,呵呵。。这样利用.NET特有的反射就可以用简单工厂模式解决更多的问题了,工厂方法模式的一部分问题也是可以通过“这样的简单工厂模式”解决的,在需要增加具体产品类时,不用增加具体工厂,是不是简单一些呀。下去试一下。。。

优点:

  • 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象。而且如何创建一个具体产品的细节完全封装在具体工厂内部,符合高内聚,低耦合。
  • 在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,很好的利用了封装和委托。

缺点:

  • 在添加新产品时,需要编写新的具体产品类(其实这不算一个缺点,因为这是不可避免的),要增加与之对应的具体工厂类。

应用情景:

  • 类不知道自己要创建哪一个对象时
  • 类用它的子类来指定创建哪个对象
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候  

工厂方法模式在ASP.NET HTTP通道中的应用,TerryLee在他的那篇文件中写的非常好,推荐去看一下。

参考资料

  • 《深入浅出设计模式(C#/Java版) 》 清华大学出版社 
  • MSDN Webcast  C#面向对象设计模式纵横谈 李建忠老师
  • 大小: 31.6 KB
分享到:
评论

相关推荐

    《精通.NET企业项目开发:最新的模式、工具与方法》 代码

    3. **设计模式**: 书中可能会涵盖常见的设计模式,如工厂模式、单例模式、观察者模式等,这些都是构建可扩展和可维护软件的基础。 4. **Entity Framework (EF)**: EF是.NET中的主流ORM(对象关系映射)框架,它简化...

    .NET设计规范:约定、惯用法与模式.pdf

    2. **设计模式**:本书详细介绍了多种经典的设计模式,如工厂模式、单例模式、建造者模式、观察者模式、装饰器模式、代理模式、适配器模式、策略模式、模板方法模式等。设计模式是解决软件设计中常见问题的经验总结...

    C# .Net设计模式与代码实现

    C# .NET设计模式是.NET框架中的一种最佳实践,它帮助开发者编写可维护、可扩展和可重用的代码。本资源包含三个部分,分别探讨了创建型、结构型和行为型设计模式。 创建型模式主要关注对象的创建过程,它们提供了在...

    .NET设计模式系列

    .NET设计模式系列是一套关于软件开发中常用设计模式的集合,尤其关注于.NET框架下的实现。设计模式是软件工程中的重要概念,它们是经过实践验证的解决方案,针对常见的设计问题提供了一种标准化的方法。这个系列可能...

    ASP.NET设计模式.pdf中文版

    ### ASP.NET设计模式知识点概述 #### 一、ASP.NET与设计模式的关系 ASP.NET作为Microsoft推出的Web应用程序开发框架,其核心在于提供一个高效且灵活的方式来创建动态网站。设计模式则是解决软件开发过程中常见问题...

    ASP.NET设计模式 源码

    ASP.NET设计模式是一种在开发基于ASP.NET平台的Web应用程序时遵循的通用解决方案模板。这些模式是经过时间考验的,能够解决常见的编程问题,提高代码的可重用性、可维护性和可扩展性。源码提供了实际应用这些模式的...

    精通.NET企业项目开发:最新的模式、工具与方法

    常见的设计模式包括但不限于单例模式、工厂模式、观察者模式等。例如,单例模式确保了一个类只有一个实例,并提供一个全局访问点;工厂模式提供了一种创建对象的接口,但允许子类决定实例化哪一个类。 #### 企业级...

    23个设计模式C#代码.学习.NET设计模式

    在.NET开发领域,设计模式是提升代码质量和可维护性的重要工具。这23个设计模式是软件工程中广泛认可的经典模式,它们源自于Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著的《设计模式:可复用面向...

    asp.net设计模式7asp.net设计模式7

    标签"asp.net设计模式7asp.net设计模式7asp.net设计模式7"同样重复,无法提供额外信息,但我们可以通过分析通常的ASP.NET设计模式来扩展知识。 从压缩包子文件的名称"轻松入门设计模式十七 [老师来了 我不知道 -- ...

    c#.net设计模式大全

    本资源包“c#.net设计模式大全”提供了全面的设计模式学习材料,帮助开发者深入理解并应用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在C#中,可以使用` sealed`关键字、`static`属性...

    asp.net 工厂模式代码

    【工厂模式】是一种常用的设计模式,它在软件开发中起到了抽象创建过程的作用,使得系统对具体产品类的依赖降到最低。在ASP.NET中,工厂模式可以用于创建对象,特别是当对象的创建过程复杂或者需要根据不同的条件...

    .NET设计模式(5):工厂方法模式(FactoryMethod)

    .wkpf,.wkpf1{ font-family:"微软雅黑"; font-size:13px; line-height:30px; text-decoration:none; color:#818183;}1599次浏览 评价:好中差  概述...这就是要说的FactoryMethod模式了。意图定义一个用户创建

    .Net设计模式大全

    《.Net设计模式大全》是一本深入探讨.Net平台下软件设计模式的著作。设计模式是软件开发中的宝贵经验总结,是解决常见问题的最佳实践。在.Net框架中,设计模式不仅有助于提升代码的可读性、可维护性和复用性,还能...

    .net工厂模式原理视频教程

    2. .NET中的实现:演示如何在C#或其他.NET语言中实现工厂模式,包括类结构的设计和代码编写。 3. 创建型设计模式对比:比较工厂模式与其他创建型模式(如单例模式、建造者模式等)的区别与联系。 4. 模式的优缺点:...

    多种.net设计模式的详细解说

    本篇文章将深入探讨以下几种.NET设计模式:抽象工厂模式、单例模式、工厂方法模式、适配器模式、简单工厂模式、职责链模式以及装饰模式。 1. 抽象工厂模式: 抽象工厂模式提供了一个接口,用于创建相关或依赖对象...

    ASP.NET 设计模式

    ### ASP.NET设计模式知识点概述 #### 一、引言与设计模式基础 - **设计模式的概念**:设计模式是软件工程领域的一种最佳实践,它提供了一种通用的解决方案来解决在特定上下文中经常出现的问题。 - **《Professional...

    VB.NET设计模式高级编程—构建强适应性的应用程序

    本资料"VB.NET设计模式高级编程—构建强适应性的应用程序"很可能是关于如何在VB.NET环境中应用各种设计模式的详细教程或实例集。这些设计模式可能包括单例模式、工厂模式、观察者模式、装饰器模式、策略模式、代理...

    asp.net设计模式源代码

    ASP.NET设计模式源代码是关于使用ASP.NET框架实现经典设计模式的实例集合。这些源代码文件,如ASPPatternsc02.zip至ASPPatternsc12.zip,提供了丰富的实践示例,帮助开发者深入理解如何在实际项目中应用设计模式。...

    ASP.NET 23种设计模式简单实例代码

    在这个名为"ASP.NET 23种设计模式简单实例代码"的压缩包中,你将找到23种经典设计模式在.NET环境下的具体实现,这对于学习和理解设计模式非常有帮助。 1. 工厂模式:工厂模式是一种创建型设计模式,它提供了一种...

Global site tag (gtag.js) - Google Analytics