二十四种设计模式:工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern)
介绍
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。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
二十四种设计模式:工厂方法模式(Factory Method Pattern)的更多相关文章
- 二十四种设计模式:模板方法模式(Template Method Pattern)
模板方法模式(Template Method Pattern) 介绍定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.Template Method使得子类可以不改变一个算法的结构即可重定义该算法 ...
- C#设计模式——工厂方法模式(Factory Method Pattern)
一.概述在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?如何提供一种封装机制来隔离出“这个易变对象 ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- 设计模式-03工厂方法模式(Factory Method Pattern)
插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- 设计模式之工厂方法模式(Factory Method Pattern)
一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...
- [设计模式]工厂方法模式(Factory Method)
模式目的 定义一个用于创建对象的接口,让其子类来决定实例化哪个类. 工厂方法模式将类的实例化延迟到了子类中进行. 模式结构 组成部分 产品(Product) - 定义了产品功能的接口 具体产品(Con ...
- 【UE4 设计模式】工厂方法模式 Factory Method Pattern 及自定义创建资源
概述 描述 又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式,或者多态工厂(Polymorphic Factory)模式 工厂父类负责定义创建产品对象的公共接口,而工厂子类 ...
- 大话设计模式--工厂方法模式 Factory Method -- C++实现
1. 工厂方法模式 定义一个用于创建对象的接口, 让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 和简单工厂模式相比: A: 简单工厂模式最大的优点在于工厂类中包含有必要的逻辑判断, ...
随机推荐
- NOIP 2011 Day 1
NOIP 2011 Day 1 tags: NOIP 搜索 categories: 信息学竞赛 总结 铺地毯 选择客栈 Mayan游戏 铺地毯 Solution 因为只会询问一个点被谁覆盖, 而且后面 ...
- 【linux】su和sudo命令的区别
来源:http://www.jb51.net/LINUXjishu/12713.html 一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比 ...
- sharding-jdbc 实现分表
Sharding-JDBC 简介 Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本: 可适用于任何基于Java的ORM框架,如:JPA.HIberna ...
- 遇见Python.h: No such file or directory的解决方法
出现No such file or directory的错误,有两种情况,一种是没有Python.h这个文件,一种是Python的版本不对, 可以进入/usr/include/文件夹下的Pythonx ...
- IIS 安装问题
今天去客户现场的内网环境安装IIS,结果第一步尴尬,是虚拟机搭出来,安装时没有源文件,然后让那边运维给系统盘挂上了,第一步通过了,可以安装了,但是由于之前也没吝啬,啥都点了,这次就合计不用那么多,结果 ...
- 解决Django在mariadb创建的表插入中文乱码的问题
1.确保你的mariadb数据库的character_set_connection.character_set_database.character_set_server的编码均为utf8 Maria ...
- 微软企业库5.0 学习之路——第二步、使用VS2010+Data Access模块建立多数据库项目
现在我就开始进入学习之路的第二步——Data Access模块,这个模块是企业库中被使用频率最高的模块,它很好的封装了数据库操作应用,为我们进行多数据库系统开发提供了便利,只需更改配置文件就 可以很快 ...
- For input string: "..."
之前在项目中通过EL表达式从cart 中取出itemPirce这个值时始终报:For input string: "${cart.itemPrice / 100}" 错误. 事故原 ...
- LD_PRELOAD的妙用,让python支持自己编译的Sqlite
LD_PRELOAD的妙用,让python支持自己编译的Sqlite LD_PRELOAD=/usr/local/sqlite/lib/libsqlite3.so.0 python3 -c " ...
- (6) go 流程控制
一. if else (1)如果只有一条语句,大括号不能省略 (2)右括号 和 else 在一行 (3)支持 if 时可以定义变量 (4)if 的风格尽量不要加括号,用空格代替 (5)多分支 二.sw ...