原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

[索引页][源码下载]

乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

作者:webabcd





介绍

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。





示例

用同样的构建过程创建Sql和Xml的Insert()方法和Get()方法。







MessageModel

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Builder

{

    /**//// <summary>

    /// Message实体类

    /// </summary>

    public class MessageModel

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="msg">Message内容</param>

        /// <param name="pt">Message发布时间</param>

        public MessageModel(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; }

        }

    }

}

SqlMessage

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Builder

{

    /**//// <summary>

    /// Sql方式操作Message

    /// </summary>

    public class SqlMessage

    {

        /**//// <summary>

        /// 获取Message

        /// </summary>

        /// <returns></returns>

        public List<MessageModel> Get()

        {

            List<MessageModel> l = new List<MessageModel>();

            l.Add(new MessageModel("SQL方式获取Message", DateTime.Now));



            return l;

        }



        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        /// <returns></returns>

        public bool Insert(MessageModel mm)

        {

            // 代码略

            return true;

        }

    }

}

XmlMessage

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Builder

{

    /**//// <summary>

    /// Xml方式操作Message

    /// </summary>

    public class XmlMessage

    {

        /**//// <summary>

        /// 获取Message

        /// </summary>

        /// <returns></returns>

        public List<MessageModel> Get()

        {

            List<MessageModel> l = new List<MessageModel>();

            l.Add(new MessageModel("XML方式获取Message", DateTime.Now));



            return l;

        }



        /**//// <summary>

        /// 插入Message

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        /// <returns></returns>

        public bool Insert(MessageModel mm)

        {

            // 代码略

            return true;

        }

    }

}

Operation

using System;

using System.Collections.Generic;

using System.Text;



using System.Reflection;



namespace Pattern.Builder

{

    /**//// <summary>

    /// 操作(Product)

    /// </summary>

    public class Operation

    {

        private string _type;

        private Dictionary<string, string> _dictionary;



        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="type">产品类型</param>

        public Operation(string type)

        {

            _dictionary = new Dictionary<string, string>();

            this._type = type;

        }



        /**//// <summary>

        /// 索引器

        /// </summary>

        /// <param name="key"></param>

        /// <returns></returns>

        public string this[string key]

        {

            get { return _dictionary[key]; }

            set { _dictionary[key] = value; }

        }



        /**//// <summary>

        /// 获得结果

        /// </summary>

        /// <returns></returns>

        public string GetResult()

        {

            Assembly assembly = Assembly.Load("Pattern.Builder");



            MethodInfo methodGet ]);

            ]), null);

            List<MessageModel> m = (List<MessageModel>)objGet;

            

            MethodInfo methodInsert ]);

            ])) });

            bool b = (bool)objInsert;



            ].PublishTime.ToString() + "<br />";

        }

    }

}

AbstractMessageBuilder

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Builder

{

    /**//// <summary>

    /// 抽象Message建造者(Builder)

    /// </summary>

    public abstract class AbstractMessageBuilder

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        /// <param name="type">产品类型</param>

        public AbstractMessageBuilder(string type)

        {

            this._operation = new Operation(type);

        }



        /**//// <summary>

        /// 操作(Product)

        /// </summary>

        protected Operation _operation;

        /**//// <summary>

        /// 操作(Product)

        /// </summary>

        public Operation Operation

        {

            get { return _operation; }

            set { _operation = value; }

        }



        /**//// <summary>

        /// 建造插入方法

        /// </summary>

        /// <param name="mm"></param>

        abstract public void BuilderInsert(MessageModel mm);



        /**//// <summary>

        /// 建造获取方法

        /// </summary>

        abstract public void BuilderGet();

    }

}

SqlMessageBuilder

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Builder

{

    /**//// <summary>

    /// SqlMessage建造者(ConcreteBuilder)

    /// </summary>

    public class SqlMessageBuilder : AbstractMessageBuilder

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        public SqlMessageBuilder()

            : base("sql")

        {

 

        }



        /**//// <summary>

        /// 建造Sql插入方法

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        public override void BuilderInsert(MessageModel mm)

        {

            base._operation["insert"] = "SqlMessage|Insert|" + mm.Message + "|" + mm.PublishTime.ToString() + "";

        }



        /**//// <summary>

        /// 建造Sql获取方法

        /// </summary>

        public override void BuilderGet()

        {

            base._operation["get"] = "SqlMessage|Get";

        }

    }

}

XmlMessageBuilder

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Builder

{

    /**//// <summary>

    /// XmlMessage建造者(ConcreteBuilder)

    /// </summary>

    public class XmlMessageBuilder : AbstractMessageBuilder

    {

        /**//// <summary>

        /// 构造函数

        /// </summary>

        public XmlMessageBuilder()

            : base("xml")

        {

 

        }



        /**//// <summary>

        /// 建造Xml插入方法

        /// </summary>

        /// <param name="mm">Message实体对象</param>

        public override void BuilderInsert(MessageModel mm)

        {

            base._operation["insert"] = "XmlMessage|Insert|"+mm.Message+"|"+mm.PublishTime.ToString()+"";

        }



        /**//// <summary>

        /// 建造Xml获取方法

        /// </summary>

        public override void BuilderGet()

        {

            base._operation["get"] = "XmlMessage|Get";

        }

    }

}

Message

using System;

using System.Collections.Generic;

using System.Text;



namespace Pattern.Builder

{

    /**//// <summary>

    /// 指导者(Director)

    /// </summary>

    public class Message

    {

        /**//// <summary>

        /// 调用具体建造者角色以创建产品对象

        /// </summary>

        /// <param name="messageBuilder">AbstractMessageBuilder</param>

        /// <param name="mm">Message实体对象</param>

        public void Construct(AbstractMessageBuilder messageBuilder, MessageModel mm)

        {

            messageBuilder.BuilderInsert(mm);

            messageBuilder.BuilderGet();

        }

    }

}

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.Builder;



public partial class Builder : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        Message m = new Message();



        AbstractMessageBuilder amb = new SqlMessageBuilder();

        m.Construct(amb, new MessageModel("插入", DateTime.Now));



        Response.Write(amb.Operation.GetResult());



        amb = new XmlMessageBuilder();

        m.Construct(amb, new MessageModel("插入", DateTime.Now));



        Response.Write(amb.Operation.GetResult());

    }

}

运行结果

类型为sql的执行结果:

True

SQL方式获取Message 2007-5-5 20:53:28

类型为xml的执行结果:

True

XML方式获取Message 2007-5-5 20:53:28





参考

http://www.dofactory.com/Patterns/PatternBuilder.aspx





OK

[源码下载]

乐在其中设计模式(C#) - 建造者模式(Builder Pattern)的更多相关文章

  1. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  2. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  3. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  4. 设计模式-05建造者模式(Builder Pattern)

    1.模式动机 比如我们要组装一台电脑,都知道电脑是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘和鼠标组成,其中非常重要的一点就是这些硬件都是可以灵活选择,但是组装步骤都是大同小异(可以组一个 ...

  5. 【UE4 设计模式】建造者模式 Builder Pattern

    概述 描述 建造者模式,又称生成器模式.是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂 ...

  6. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  7. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  8. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  9. 乐在其中设计模式(C#) - 提供者模式(Provider Pattern)

    原文:乐在其中设计模式(C#) - 提供者模式(Provider Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 提供者模式(Provider Pattern) 作者:weba ...

随机推荐

  1. make工具与Makefile文件

    make工具与Makefile文件 阅读目录 1. make工具 2. Makefile文件 3. Makefile的简单示例 4. 伪目标 5. Makefile 自动化变量 6. 编译生成多个可执 ...

  2. 算法起步之动态规划LCS

    原文:算法起步之动态规划LCS 前一篇文章我们了解了什么是动态规划问题,这里我们再来看动态规划另一个经典问题,最长公共子序列问题(LCS),什么是子序列,我们定义:一个给定序列将其中的0个或者多个元素 ...

  3. 【Bug笔记】The superclass &quot;javax.servlet.http.HttpServlet&quot; was not found on the Java Build Path

    因为今天下载了一个eclipse se的版本号.所以想把原本eclipse ee这个软件外面的目录eclipse名字该成eclipse ee,方便以后的区分和管理.改了后又一次打开eclipse ee ...

  4. 无法删除 C_PAN.GHO: 访问被拒绝 解决办法

    右击“C-PAN.GHO",属性->安全(如果没有安全选项卡,可以在工具->文件夹选项->查看中将”使用简单头文件共享“前的对勾去掉),这时”添加“和”删除“按钮应该是不可 ...

  5. Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式

    原文:Wix学习整理(7)--在开始菜单中为HelloWorld添加卸载快捷方式 通过前面的几篇随笔,我们已经给我们的HelloWorld提供了填写注册表信息,以及开始菜单快捷方式和桌面快捷方式.这些 ...

  6. poj3764(dfs+Trie树+贪心)

    题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值, ...

  7. 假设拦截WebView的错误和OS升级到4.4后链接不能点击的问题

    android OS升级到4.4之后,有些WebView的链接我们点击无效了,以下能够解决当中的某一种情况: webviewClient的shouldOverrideUrlLoading方法必须返回f ...

  8. 《火球——UML大战需求分析》(第1章 大话UML)——1.3 行为型的UML(Behavior Diagram)

    说明: <火球——UML大战需求分析>是我撰写的一本关于需求分析及UML方面的书,我将会在CSDN上为大家分享前面几章的内容,总字数在几万以上,图片有数十张.欢迎你按文章的序号顺序阅读,谢 ...

  9. SVN的命令解析(感觉不错就转了)

    本文链接: http://www.php-oa.com/2008/03/12/svnminglingzailinuxxiadeshiyong.html .将文件checkout到本地目录 svn ch ...

  10. CentOS7 编译安装LNMP

    (文章来自:http://www.cnblogs.com/i-it/p/3841840.html,请各位到这个网址去看原文的) LNMP(Linux-Nginx-Mysql-PHP),本文在CentO ...