您现在的位置:软界网技术中心软件工程项目管理工具 > 技术显示
设计模式 - Builder Pattern(建造者模式)
2008-2-26 23:59:50   网友评论       阅读次数 点此评论
   介绍
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


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



MessageModel
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
软件开发网 www.mscto.com
namespacePattern.Builder
{

///<summary>
///Message实体类
///</summary>

publicclassMessageModel
{

///<summary>
///构造函数
///</summary>
///<paramname="msg">Message内容</param>
///<paramname="pt">Message发布时间</param>

publicMessageModel(stringmsg,DateTimept)
{

软件开发网 www.mscto.cn


this._message=msg;
this._publishTime=pt;
}


privatestring_message;
///<summary>

///Message内容
///</summary>

publicstringMessage
{
软件开发网 www.mscto.cn

get{return_message;}
set{_message=value;}


}


privateDateTime_publishTime;
///<summary>
///Message发布时间
///</summary>

publicDateTimePublishTime
{
get{return_publishTime;}

set{_publishTime=value;}
}

}

}


SqlMessage
usingSystem;
usingSystem.Collections.Generic;

usingSystem.Text;

namespacePattern.Builder
{

软件开发网 www.mscto.com


///<summary>
///Sql方式操作Message
///</summary>

publicclassSqlMessage
{ 软件开发网 www.mscto.cn
///<summary>
///获取Message
///</summary>
///<returns></returns>

publicList<MessageModel>Get()

{
List
<MessageModel>l=newList<MessageModel>();


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

returnl;
}


///<summary>
///插入Message
///</summary>
///<paramname="mm">Message实体对象</param>
///<returns></returns>

publicboolInsert(MessageModelmm)
{ 软件开发网 www.mscto.cn
//代码略
returntrue;
}

}

}


XmlMessage
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespacePattern.Builder

{
///<summary> 软件开发网 www.mscto.com
///Xml方式操作Message
///</summary>

publicclassXmlMessage
{ 软件开发网 www.mscto.cn
///<summary>


///获取Message
///</summary>
///<returns></returns>

publicList<MessageModel>Get()
{
List
<MessageModel>l=newList<MessageModel>();
l.Add(
newMessageModel("XML方式获取Message",DateTime.Now));

returnl;
}

软件开发网 www.mscto.com


///<summary>

///插入Message
///</summary>
///<paramname="mm">Message实体对象</param> 软件开发网 www.mscto.cn
///<returns></returns>

publicboolInsert(MessageModelmm)
{
//代码略
returntrue;
}

}

}
软件开发网 www.mscto.com

Operation
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

usingSystem.Reflection;

namespacePattern.Builder
{ 软件开发网 www.mscto.cn
///<summary>


///操作(Product)
///</summary>

publicclassOperation
{


privatestring_type;
privateDictionary<string,string>_dictionary;

///<summary>
///构造函数
///</summary>
///<paramname="type">产品类型</param>

publicOperation(stringtype)
{
_dictionary
=newDictionary<string,string>();
this._type=type;
}



///<summary>
软件开发网 www.mscto.com

///索引器
///</summary>
///<paramname="key"></param>
///<returns></returns>

publicstringthis[stringkey]
{ 软件开发网 www.mscto.cn
get{return_dictionary[key];}
set{_dictionary[key]=value;}


}


///<summary>
///获得结果
///</summary>
///<returns></returns>

publicstringGetResult()
软件开发网 www.mscto.com

{
Assemblyassembly
=Assembly.Load("Pattern.Builder");

MethodInfomethodGet
=assembly.GetType("Pattern.Builder."+_dictionary["get"].Split('|')[0]).GetMethod(_dictionary["get"].Split('|')[1]);

objectobjGet=methodGet.Invoke(assembly.CreateInstance("Pattern.Builder."+_dictionary["get"].Split('|')[0]),null);
List
<MessageModel>m=(List<MessageModel>)objGet;

MethodInfomethodInsert
=assembly.GetType("Pattern.Builder."+_dictionary["insert"].Split('|')[0]).GetMethod(_dictionary["insert"].Split('|')[1]);
objectobjInsert=methodInsert.Invoke(assembly.CreateInstance("Pattern.Builder."+_dictionary["insert"].Split('|')[0]),newobject[]{newMessageModel(_dictionary["insert"].Split('|')[2],Convert.ToDateTime(_dictionary["insert"].Split('|')[3]))});
boolb=(bool)objInsert;

return"类型为"+this._type+"的执行结果:<br/>"+b.ToString()+"<br/>"+m[0].Message+""+m[0].PublishTime.ToString()+"<br/>";


}

}

}


AbstractMessageBuilder
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;

namespacePattern.Builder
{ 软件开发网 www.mscto.com
///<summary>

///抽象Message建造者(Builder)
///</summary>

publicabstractclassAbstractMessageBuilder
{


///<summary>
///构造函数
///</summary>
///<paramname="type">产品类型</param>

publicAbstractMessageBuilder(stringtype)
{

软件开发网 www.mscto.cn


this._operation=newOperation(type);
}


///<summary>
///操作(Product)
///</summary>

protectedOperation_operation;
///<summary>
///操作(Product)
///</summary>

publicOperationOperation
{ 软件开发网 www.mscto.cn
get{return_operation;}

set{_operation=value;}

}


///<summary>


///建造插入方法
///</summary>
///<paramname="mm"></param>

abstractpublicvoidBuilderInsert(MessageModelmm);



///<summary>

///建造获取方法
///</summary>

abstractpublicvoidBuilderGet();


}

}


SqlMessageBuilder
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;


namespacePattern.Builder
{

///<summary>


///SqlMessage建造者(ConcreteBuilder)
///</summary>

publicclassSqlMessageBuilder:AbstractMessageBuilder
{


///<summary>
软件开发网 www.mscto.cn

///构造函数
///</summary>

publicSqlMessageBuilder()
:
base("sql")

软件开发网 www.mscto.com


{
软件开发网 www.mscto.cn

}


///<summary> 软件开发网 www.mscto.cn
///建造Sql插入方法
///</summary>
///<paramname="mm">Message实体对象</param>
软件开发网 www.mscto.com
publicoverridevoidBuilderInsert(MessageModelmm)
{

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


///<summary>
///建造Sql获取方法
///</summary>

publicoverridevoidBuilderGet()
{
base._operation["get"]="SqlMessage|Get";
}

}

}


XmlMessageBuilder
usingSystem;
usingSystem.Collections.Generic;

usingSystem.Text;

namespacePattern.Builder
{ 软件开发网 www.mscto.cn
///<summary> 软件开发网 www.mscto.cn
///XmlMessage建造者(ConcreteBuilder)
///</summary>

publicclassXmlMessageBuilder:AbstractMessageBuilder