乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
作者:webabcd
介绍
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
示例
有Message和MessageModel,Message有一个Insert()方法,该方法的参数是MessageModel。

AbstractMessageModel
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.AbstractFactory

{
/**//// <summary>
/// 抽象Message实体类(AbstractProduct)
/// </summary>
public abstract class AbstractMessageModel
{
/**//// <summary>
/// 构造函数
/// </summary>
public AbstractMessageModel()
{
}

/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="msg">Message内容</param>
/// <param name="pt">Message发布时间</param>
public AbstractMessageModel(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; }
}

/**//// <summary>
/// UserId
/// </summary>
public abstract string UserId
{
get;
set;
}
}
}
SqlMessageModel
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.AbstractFactory

{
/**//// <summary>
/// SqlMessage实体类(Product)
/// </summary>
public class SqlMessageModel : AbstractMessageModel
{
/**//// <summary>
/// 构造函数
/// </summary>
public SqlMessageModel()
: base()
{
}

/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="userId">UserId</param>
/// <param name="msg">Message内容</param>
/// <param name="pt">Message发布时间</param>
public SqlMessageModel(string userId, string msg, DateTime pt)
: base(msg, pt)
{
this._userId = userId;
}
private string _userId;
/**//// <summary>
/// Message内容
/// </summary>
public override string UserId
{
get
{ return _userId; }
set
{ _userId = value; }
}
}
}
XmlMessageModel
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.AbstractFactory

{
/**//// <summary>
/// XmlMessage实体类(Product)
/// </summary>
public class XmlMessageModel : AbstractMessageModel
{
/**//// <summary>
/// 构造函数
/// </summary>
public XmlMessageModel()
: base()
{
}

/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="userId">UserId</param>
/// <param name="msg">Message内容</param>
/// <param name="pt">Message发布时间</param>
public XmlMessageModel(string userId, string msg, DateTime pt)
: base (msg, pt)
{
this._userId = userId;
}
private string _userId;
/**//// <summary>
/// Message内容
/// </summary>
public override string UserId
{
// 解密算法后的值
get
{ return _userId; } 
// 加密算法后的值
set
{ _userId = value; }
}
}
}
AbstractMessage
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.AbstractFactory

{
/**//// <summary>
/// 操作Message抽象类(AbstractProduct)
/// </summary>
public abstract class AbstractMessage
{
/**//// <summary>
/// 插入Message
/// </summary>
/// <param name="amm">AbstractMessageModel</param>
/// <returns></returns>
public abstract string Insert(AbstractMessageModel amm);
}
}
SqlMessage
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.AbstractFactory

{
/**//// <summary>
/// Sql方式操作Message类(Product)
/// </summary>
public class SqlMessage : AbstractMessage
{
/**//// <summary>
/// 插入Message
/// </summary>
/// <param name="amm">AbstractMessageModel</param>
/// <returns></returns>
public override string Insert(AbstractMessageModel amm)
{
return "Sql方式插入Message。帐号:" + amm.UserId
+ ";内容:" + amm.Message
+ ";时间:" + amm.PublishTime.ToString();
}
}
}
XmlMessage
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.AbstractFactory

{
/**//// <summary>
/// Xml方式操作Message类(Product)
/// </summary>
public class XmlMessage : AbstractMessage
{
/**//// <summary>
/// 插入Message
/// </summary>
/// <param name="amm">AbstractMessageModel</param>
/// <returns></returns>
public override string Insert(AbstractMessageModel amm)
{
return "Xml方式插入Message。帐号:" + amm.UserId
+ ";内容:" + amm.Message
+ ";时间:" + amm.PublishTime.ToString();
}
}
}
AbstractMessageFactory
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.AbstractFactory

{
/**//// <summary>
/// 抽象Message工厂(AbstractFactory)
/// </summary>
public abstract class AbstractMessageFactory
{
/**//// <summary>
/// 创建MessageModel对象
/// </summary>
/// <returns></returns>
public abstract AbstractMessageModel CreateMessageModel();

/**//// <summary>
/// 创建Message对象
/// </summary>
/// <returns></returns>
public abstract AbstractMessage CreateMessage();
}
}SqlMessageFactory
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.AbstractFactory

{
/**//// <summary>
/// SqlMessage工厂(ConcreteFactory)
/// </summary>
public class SqlMessageFactory : AbstractMessageFactory
{
/**//// <summary>
/// 创建SqlMessageModel对象
/// </summary>
/// <returns></returns>
public override AbstractMessageModel CreateMessageModel()
{
return new SqlMessageModel();
}

/**//// <summary>
/// 创建SqlMessage对象
/// </summary>
/// <returns></returns>
public override AbstractMessage CreateMessage()
{
return new SqlMessage();
}
}
}
XmlMessageFactory
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.AbstractFactory

{
/**//// <summary>
/// XmlMessage工厂(ConcreteFactory)
/// </summary>
public class XmlMessageFactory : AbstractMessageFactory
{
/**//// <summary>
/// 创建XmlMessageModel对象
/// </summary>
/// <returns></returns>
public override AbstractMessageModel CreateMessageModel()
{
return new XmlMessageModel();
}

/**//// <summary>
/// 创建XmlMessage对象
/// </summary>
/// <returns></returns>
public override AbstractMessage CreateMessage()
{
return new XmlMessage();
}
}
}
Message
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.AbstractFactory

{
/**//// <summary>
/// Context类
/// </summary>
public class Message
{
private AbstractMessage _insertMessage;
private AbstractMessageModel _messageModel;

/**//// <summary>
/// 构造函数
/// </summary>
/// <param name="factory">AbstractMessageFactory</param>
public Message(AbstractMessageFactory factory)
{
DateTime pt = DateTime.Now;
_insertMessage = factory.CreateMessage();
_messageModel = factory.CreateMessageModel();
}

/**//// <summary>
/// 插入Message
/// </summary>
/// <param name="userId">UserId</param>
/// <param name="msg">Message内容</param>
/// <param name="pt">Message发布时间</param>
/// <returns></returns>
public string Insert(string userId, string msg, DateTime pt)
{
_messageModel.UserId = userId;
_messageModel.Message = msg;
_messageModel.PublishTime = pt;
return _insertMessage.Insert(_messageModel);
}
}
}
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.AbstractFactory;
public partial class AbstractFactory : System.Web.UI.Page

{
protected void Page_Load(object sender, EventArgs e)
{
AbstractMessageFactory amf = new SqlMessageFactory();
Message m = new Message(amf);
Response.Write(m.Insert("admin", "Sql方式", DateTime.Now));
Response.Write("<br />");
amf = new XmlMessageFactory();
m = new Message(amf);
Response.Write(m.Insert("user", "Xml方式", DateTime.Now));
}
}
运行结果
Sql方式插入Message。帐号:admin;内容:Sql方式;时间:2007-5-3 22:04:56
Xml方式插入Message。帐号:user;内容:Xml方式;时间:2007-5-3 22:04:56
参考
http://www.dofactory.com/Patterns/PatternAbstract.aspx
OK
[源码下载]
乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)的更多相关文章
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
- 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern
概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...
- 设计模式之抽象工厂模式(Abstract Factory Pattern)
一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释
抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...
- Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)
一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...
- C#设计模式——抽象工厂模式(Abstract Factory Pattern)
一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...
- 六个创建模式之抽象工厂模式(Abstract Factory Pattern)
问题: 使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护.因此可以考虑使用一个工厂创建一个产品族. 定义: 提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品 ...
- 23种设计模式之抽象工厂(Abstract Factory Pattern)
抽象工厂 当想创建一组密不可分的对象时,工厂方法似乎就不够用了 抽象工厂是应对产品族概念的.应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品.比如,每个汽车公司可能要同时生产轿车.货车. ...
随机推荐
- 使用独立PID namespace防止误杀进程
一段错误的代码 首先看一段错误的代码: #!/bin/bash SLICE=100; slppid=1; pidfile=/var/run/vpnrulematch.pid # 停止之前的sleep ...
- GitHub上最火的74个Android开源项目
GitHub上最火的74个Android开源项目 1.ActionBarSherlock ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库, ...
- 图像处理特征不变算子系列之Moravec算子(一)
论文转载请注明出处:http://blog.csdn.net/kezunhai 1977年,Moravec提出了兴趣点(Points of Interests)的概念,并应用于解决Stanford C ...
- 浅谈OCR之Onenote 2010
原文:浅谈OCR之Onenote 2010 上一次我们讨论了Tesseract OCR引擎的用法,作为一款老牌的OCR引擎,目前已经开源,最新版本3.0中更是加入了中文OCR功能,再加上Google的 ...
- SCU 3133(博弈)
传送门:windy和水星 -- 水星游戏 2 题意:在一张由 n*m 的格子组成的棋盘上放着 k 个骑士每个骑士的位置为(xi,yi),表示第xi行,第yi列骑士如果当前位置为(x,y),一步可以走的 ...
- xcode 改动整个项目名
目标为:将项目名XCD4改成xcd5. 先上结果图:==> 1.在左側的导航区域点击两次项目名,两次间隔时间略微长些,项目名会变成可编辑状态. 将名称改动为xcd5后按enter键弹出一个对话框 ...
- hdu 1561 The more, The Better (依赖背包 树形dp)
题目: 链接:点击打开链接 题意: 非常明显的依赖背包. 思路: dp[i][j]表示以i为根结点时攻击j个城堡得到的最大值.(以i为根的子树选择j个点所能达到的最优值) dp[root][j] = ...
- Photon + Unity3D 在线游戏开发 学习笔记(两)
本文和大家 和大家说说 Photon 解压后的目录结构 这里面最基本的我们 以后开发要用到的目录 就是 deploy目录,这个目录里 放的是要挂载的 server 当然我们的 server端也要放在 ...
- redis加入到Windows 服务
1.cmd命令 安装命令: redis-server.exe --service-install redis.windows.conf --loglevel verbose 卸载命令: redi ...
- Linux下SVN安装配置全程实录(转)
一.安装SVN默认安装到/usr/local/bin下面 二.创建仓库 svnadmin create /home/svnrepo /root/svnrepo为所创建仓库的路径,理论上可以是任何目录 ...