原文:乐在其中设计模式(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)的更多相关文章

  1. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  2. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  3. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  4. 设计模式之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...

  5. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  6. Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  7. C#设计模式——抽象工厂模式(Abstract Factory Pattern)

    一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...

  8. 六个创建模式之抽象工厂模式(Abstract Factory Pattern)

    问题: 使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护.因此可以考虑使用一个工厂创建一个产品族. 定义: 提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品 ...

  9. 23种设计模式之抽象工厂(Abstract Factory Pattern)

    抽象工厂 当想创建一组密不可分的对象时,工厂方法似乎就不够用了 抽象工厂是应对产品族概念的.应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品.比如,每个汽车公司可能要同时生产轿车.货车. ...

随机推荐

  1. CreateThread、_beginthreadex和AfxBeginThread 的区别

    CreateThread._beginthreadex和AfxBeginThread 创建线程好几个函数可以使用,可是它们有什么区别,适用于什么情况呢?参考了一些资料,写得都挺好的,这里做一些摘抄和整 ...

  2. 4.windows和Linux下创建oracleusername表空间,表,插入数据,用户管理表等操作

    进入超级管理员,运行下面命令 Window下创建数据库.表空间,用户,插入数据等操作 -- 01 创建表空间 -- 注意表空间的路径 依据实际安装环境进行调整 CREATE TABLESPACE ts ...

  3. 【大话QT之十七】Jenkins介绍及安装使用文档(与Git集成)

    文章文件夹结构例如以下: 1> Jenkins与Git相关介绍 2> Jenkins部署安装 3> Gitblit部署安装 4> Jenkins与Git集成使用 5> 项 ...

  4. 实现ios常见菜单效果的思路

    眼下见过的实现边側菜单的效果.比較流行的有下面三种:(效果图) 1.菜单条覆盖在部分主视图上 附上实现该效果的一个不错的源代码地址: http://code4app.com/ios/RNFrosted ...

  5. sql2005,sql2008,sql2012清空日志语句

    原文:sql2005,sql2008,sql2012清空日志语句 sql2005清空日志语句 Backup Log DbName WITH no_log GO DUMP TRANSACTION DbN ...

  6. poj2226(最小点覆盖)

    传送门:Muddy Fields 题意:一个由r行c列方格组成的田地,里面有若干个方格充满泥泞,其余方格都是草.要用长度不限,宽度为1的长木板来覆盖这些泥方格,但不能覆盖草地.最少要用多少个长木板. ...

  7. 解决IE11无法下载文件的问题

    [问题描写叙述] 单击IE底部下载工具栏没反应,点击"另存为"也没反应 [解决方法] 打开IE11,依次打开菜单:Internet 选项 -> 高级 -> 重置,重置完 ...

  8. Learning Cocos2d-x for WP8(1)——创建首个项目

    原文:Learning Cocos2d-x for WP8(1)--创建首个项目 Cocos2d-x for WP8开发语言是C++,系列文章将参考兄弟篇Learning Cocos2d-x for ...

  9. Ubuntu 14.4 使用中遇到的问题汇总

    1.java程序字体问题. 基本的原因是openjdk的缘故 下载最新的jdk安装,地址:http://www.oracle.com/technetwork/java/javase/downloads ...

  10. html学习 - 自己主动跳转与自己主动刷新

    自己主动刷新 事实上自己主动刷新和跳转没啥差别,刷新就是跳转到本地址. 有几种办法,首先是直接在html的<head>标签里加入以下的代码. html代码 代码都放在<head> ...