乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

简介:
[索引页]
[源码下载]


乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)


作者: webabcd


介绍
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。


示例
有SqlMessage和XmlMessage,用Factory Method来实例化它们。
MessageModel
using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace Pattern.FactoryMethod 
{ 
         /// <summary> 
         /// Message实体类 
         /// </summary> 
         public  class MessageModel 
        { 
                 /// <summary> 
                 /// 构造函数 
                 /// </summary> 
                 /// <param name="msg">Message内容</param> 
                 /// <param name="pt">Message发布时间</param> 
                 public MessageModel( string msg, DateTime pt) 
                { 
                         this._message = msg; 
                         this._publishTime = pt; 
                } 
 
                 private  string _message; 
                 /// <summary> 
                 /// Message内容 
                 /// </summary> 
                 public  string Message 
                { 
                        get {  return _message; } 
                        set { _message = value; } 
                } 
 
                 private DateTime _publishTime; 
                 /// <summary> 
                 /// Message发布时间 
                 /// </summary> 
                 public DateTime PublishTime 
                { 
                        get {  return _publishTime; } 
                        set { _publishTime = value; } 
                } 
        } 
}
 
AbstractMessage
using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace Pattern.FactoryMethod 
{ 
         /// <summary> 
         /// 操作Message抽象类(Product) 
         /// </summary> 
         public  abstract  class AbstractMessage 
        { 
                 /// <summary> 
                 /// 获取Message 
                 /// </summary> 
                 /// <returns></returns> 
                 public  abstract List<MessageModel> Get(); 
 
                 /// <summary> 
                 /// 插入Message 
                 /// </summary> 
                 /// <param name="mm">Message实体对象</param> 
                 /// <returns></returns> 
                 public  abstract  bool Insert(MessageModel mm); 
        } 
}
 
SqlMessage
using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace Pattern.FactoryMethod 
{ 
         /// <summary> 
         /// Sql方式操作Message(ConcreteProduct) 
         /// </summary> 
         public  class SqlMessage : AbstractMessage 
        { 
                 /// <summary> 
                 /// 获取Message 
                 /// </summary> 
                 /// <returns></returns> 
                 public  override List<MessageModel> Get() 
                { 
                        List<MessageModel> l =  new List<MessageModel>(); 
                        l.Add( new MessageModel( "SQL方式获取Message", DateTime.Now)); 
 
                         return l; 
                } 
 
                 /// <summary> 
                 /// 插入Message 
                 /// </summary> 
                 /// <param name="mm">Message实体对象</param> 
                 /// <returns></returns> 
                 public  override  bool Insert(MessageModel mm) 
                { 
                         // 代码略 
                         return  true; 
                } 
        } 
}
 
XmlMessage
using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace Pattern.FactoryMethod 
{ 
         /// <summary> 
         /// Xml方式操作Message(ConcreteProduct) 
         /// </summary> 
         public  class XmlMessage : AbstractMessage 
        { 
                 /// <summary> 
                 /// 获取Message 
                 /// </summary> 
                 /// <returns></returns> 
                 public  override List<MessageModel> Get() 
                { 
                        List<MessageModel> l =  new List<MessageModel>(); 
                        l.Add( new MessageModel( "XML方式获取Message", DateTime.Now)); 
 
                         return l; 
                } 
 
                 /// <summary> 
                 /// 插入Message 
                 /// </summary> 
                 /// <param name="mm">Message实体对象</param> 
                 /// <returns></returns> 
                 public  override  bool Insert(MessageModel mm) 
                { 
                         // 代码略 
                         return  true; 
                } 
        } 
}
 
AbstractMessageFactory
using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace Pattern.FactoryMethod 
{ 
         /// <summary> 
         /// 抽象Message工厂(Creator) 
         /// </summary> 
         public  abstract  class AbstractMessageFactory 
        { 
                 // An Operation 
 
                 /// <summary> 
                 /// 工厂方法 
                 /// </summary> 
                 /// <returns>AbstractMessage</returns> 
                 public  abstract AbstractMessage CreateMessage(); 
        } 
}
 
SqlMessageFactory
using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace Pattern.FactoryMethod 
{ 
         /// <summary> 
         /// SqlMessage工厂(ConcreteCreator) 
         /// </summary> 
         public  class SqlMessageFactory : AbstractMessageFactory 
        { 
                 /// <summary> 
                 /// 实现工厂方法,返回SqlMessage对象 
                 /// </summary> 
                 /// <returns></returns> 
                 public  override AbstractMessage CreateMessage() 
                { 
                         return  new SqlMessage(); 
                } 
        } 
}
 
XmlMessageFactory
using System; 
using System.Collections.Generic; 
using System.Text; 
 
namespace Pattern.FactoryMethod 
{ 
         /// <summary> 
         /// XmlMessage工厂(ConcreteCreator) 
         /// </summary> 
         public  class XmlMessageFactory : AbstractMessageFactory 
        { 
                 /// <summary> 
                 /// 实现工厂方法,返回XmlMessage对象 
                 /// </summary> 
                 /// <returns></returns> 
                 public  override AbstractMessage CreateMessage() 
                { 
                         return  new XmlMessage(); 
                } 
        } 
}
 
client
using System; 
using System.Data; 
using System.Configuration; 
using System.Collections; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
 
using Pattern.FactoryMethod; 
 
public partial  class FactoryMethod : System.Web.UI.Page 
{ 
         protected  void Page_Load( object sender, EventArgs e) 
        { 
                AbstractMessageFactory amf =  new SqlMessageFactory(); 
                AbstractMessage am = amf.CreateMessage(); 
 
                Response.Write(am.Insert( new MessageModel( "插入", DateTime.Now))); 
                Response.Write( "<br />"); 
                Response.Write(am.Get()[0].Message +  " " + am.Get()[0].PublishTime.ToString()); 
                Response.Write( "<br />"); 
 
 
                amf =  new XmlMessageFactory(); 
                am = amf.CreateMessage(); 
 
                Response.Write(am.Insert( new MessageModel( "插入", DateTime.Now))); 
                Response.Write( "<br />"); 
                Response.Write(am.Get()[0].Message +  " " + am.Get()[0].PublishTime.ToString()); 
        } 
}
 
 
运行结果
True
SQL方式获取Message 2007-5-4 22:34:39
True
XML方式获取Message 2007-5-4 22:34:39


参考
http://www.dofactory.com/Patterns/PatternFactory.aspx


OK
[源码下载]
 





     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/344514 ,如需转载请自行联系原作者

相关文章
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
466 16
|
设计模式 Java 关系型数据库
【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)
一、入门 什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。 简单来说,抽象工厂模式是工厂方法模式的升级版,它能够创建一组相
534 14
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
设计模式 关系型数据库
「全网最细 + 实战源码案例」设计模式——工厂方法模式
简单工厂模式是一种创建型设计模式,通过一个工厂类根据传入参数创建不同类型的产品对象,也称“静态工厂方法”模式。其结构包括工厂类、产品接口和具体产品类。适用于创建对象种类较少且调用者无需关心创建细节的场景。优点是封装性强、代码复用性好;缺点是扩展性差,增加新产品时需修改工厂类代码,违反开闭原则。
354 15
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
529 19
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
543 3
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
2667 0