原文:乐在其中设计模式(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. linux通过使用mail发送电子邮件

    通过外部方法发送的电子邮件 bin/mail默认为本地sendmail发送电子邮件,求本地的机器必须安装和启动Sendmail服务.配置很麻烦,并且会带来不必要的 资源占用.而通过改动配置文件能够使用 ...

  2. sql连接错误(Microsoft SQL Server,错误:2)

    昨天用SQL语句建表的时候写了一段代码,对于代码的逻辑和内容我不太肯定对不正确.反正是毫不犹豫的让它运行了,过程中出现好几个错误,当时没有太在意,想着大不了出错了再重写一个.结果--玩坏了,从昨天到如 ...

  3. linux在下面APK反编译软件和过程的描述

    需要的工具: 1.apktool apk打包工具 下载地址:http://android-apktool.googlecode.com/files/apktool1.5.2.tar.bz2 安装:直接 ...

  4. UNIX高级环境编程1

    UNIX高级环境编程1 故宫角楼是很多摄影爱好者常去的地方,夕阳余辉下的故宫角楼平静而安详. 首先,了解一下进程的基本概念,进程在内存中布局和内容. 此外,还需要知道运行时是如何为动态数据结构(如链表 ...

  5. [置顶] 一步一步学android之事件篇——下拉列表事件

    上一篇RadioGroup比较简单,所以再学习个spinner的OnItemSelectedListener事件,前面说过spinner的主要功能就是提供列表显示的选择,比如我们在选择城市的时候就会用 ...

  6. vim php代码规范

    vim 代码规范工具php-cs-fixer.phar (參考https://github.com/FriendsOfPHP/PHP-CS-Fixer) INSTALL curl http://get ...

  7. SimpleDateFormat 的线程安全问题与解决方式

    SimpleDateFormat 的线程安全问题 SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的详细类. 它同意格式化 (date -> text).语法分析 (te ...

  8. cocos2D(三)---- 第一cocos2d的程序代码分析

    在第一讲中已经新建了第一个cocos2d程序,执行效果例如以下: 在这讲中我们来分析下里面的代码,了解cocos2d的工作原理,看看屏幕上的这个"Hello World"是怎样显示 ...

  9. WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心

    原文:WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心 流文档是WPF中的一种独特的文档承载格式,它的书写和呈现方式都很像HTML,它也几乎具备了HTML的绝大多数优势,并提供了更 ...

  10. WPF界面设计技巧(10)-样式的继承

    原文:WPF界面设计技巧(10)-样式的继承 PS:现在我的MailMail完工了,进入内测阶段了,终于可以腾出手来写写教程了哈,关于MailMail的介绍及内测程序索取:http://www.cnb ...