原文:乐在其中设计模式(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. XML实例文档

    from: http://www.w3school.com.cn/xpath/xpath_examples.asp XML实例文档 我们将在下面的例子中使用这个 XML 文档: "books ...

  2. A Game of Thrones(17) - Bran

    It seemed as though he had been falling for years. Fly, a voice whispered in the darkness, but Bran ...

  3. 给一个非常长的字符串str 另一个字符集比方{a,b,c} 找出str 里包括{a,b,c}的最短子串。要求O(n)

    给一个非常长的字符串str 另一个字符集比方{a,b,c} 找出str 里包括{a,b,c}的最短子串.要求O(n). 比方,字符集是a,b,c,字符串是abdcaabcx,则最短子串为abc. 设置 ...

  4. uva11426(莫比乌斯反演)

    传送门:GCD Extreme (II) 题意:给定n(n<=4000000),求G G=0 for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) ...

  5. hdu1876(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1876 题意:问机器人到达终点的过程中最多有几次完全消耗完能量,消耗完这么多次能量的方式有几种. 分析: ...

  6. UVA 10140 - Prime Distance(数论)

    10140 - Prime Distance 题目链接 题意:求[l,r]区间内近期和最远的素数对. 思路:素数打表,打到sqrt(Max)就可以,然后利用大的表去筛素数.因为[l, r]最多100W ...

  7. sys_refcursor的使用方法实例

    --创建过程,參数为sys_refcursor,为out型 create or replace procedure aabbsys_refcursor(o out sys_refcursor) is ...

  8. COLORREF和COLOR和RGB的总结

    一.COLORREF与RGB的相互转化 RGB(r,g,b)是一个宏 实际上它做得事是((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((D ...

  9. Monkey源代码分析之执行流程

    在<MonkeyRunner源代码分析之与Android设备通讯方式>中.我们谈及到MonkeyRunner控制目标android设备有多种方法.当中之中的一个就是在目标机器启动一个mon ...

  10. (适合入门)JVM堆内存相关的启动参数:年轻一代、岁和永久代内存分配

    假设你要观察JVM进程消耗的堆内存,通过命令工具jmap或可视化工具jvisualvm.exe.JVM这些参数的默认启动值.假设你想知道JVM内存分配策略,最开始手动设置这些参数.通过JDK统计结果, ...