原文:乐在其中设计模式(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. Android开源项目大全 - 工具类

    主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过依赖注入减少Vie ...

  2. python - ImportError: No module named http.cookies error when installing cherrypy 3.2 - Stack Overflow

    python - ImportError: No module named http.cookies error when installing cherrypy 3.2 - Stack Overfl ...

  3. web开发性能优化---用户体验篇

    怎样从技术角度怎样增强用户体验.都是非常多平台都在做的事情,依据个人实际经验碰到几种体验做下总结. 1.降低页面刷新白屏 适当使用ajax技术.改善刷新白屏现象. 2.信息提醒,邮件.站内信.短信在购 ...

  4. c++中sort()及qsort()的使用方法总结

    当并算法具体解释请见点我 想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表:   函数名 ...

  5. Java对象序列化/反序列化的注意事项

    Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...

  6. 在Windows下使用Hexo+GithubPage搭建博客的过程

    1.安装Node.js 下载地址:传送门 去 node.js 官网下载相应版本,进行安装即可. 可以通过node -v的命令来测试NodeJS是否安装成功 2.安装Git 下载地址:传送门 去 Git ...

  7. poj 2299 树状数组求逆序数+离散化

    http://poj.org/problem?id=2299 最初做离散化的时候没太确定可是写完发现对的---由于后缀数组学的时候,,这样的思维习惯了吧 1.初始化as[i]=i:对as数组依照num ...

  8. win7下硬盘安装win7+linuxUbuntu双系统方法

    Linux安装大致介绍: win7下硬盘安装win7+linuxUbuntu双系统方法 原则: 所有的看完在装,请仔细看 一 条件: 1. 系统选择 linux unbuntu12.04.2-desk ...

  9. 忘记root密码时如何重设密码

    哈哈,太久没用linux了,把自己的登陆密码给忘了.今天找了下方法如何重设密码以登陆系统. 此文仅以作备忘. 忘记linux密码时,可以使用单用户模式进入linux,修改root密码.1.在linux ...

  10. hibernate 一对多,多对一,多对多实体映射完美解决方案(再也不会糊涂了,哈哈)