定義建造步驟的抽象介面,持有產品物件 Operation,強制子類實作具體建造邏輯:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Builder
{
///
/// 抽象 Message 建造者(Builder)
///
public abstract class AbstractMessageBuilder
{
///
/// 建構函式
///
/// 產品類型
public AbstractMessageBuilder(string type)
{
this._operation = new Operation(type);
}
///
/// 操作(Product)
///
protected Operation _Operation;
///
/// 操作(Product)
///
public Operation Operation
{
get { return _Operation; }
set { _Operation = value; }
}
///
/// 建造插入方法
///
///
abstract public void BuilderInsert(MessageModel mm);
///
/// 建造獲取方法
///
abstract public void BuilderGet();
}
}
實作 SQL 專屬的建造邏輯,構建 SQL 格式的操作指令字串:
using System;
using System.Collections.Generic;
using System.Text;
namespace Pattern.Builder
{
///
/// SqlMessage 建造者(ConcreteBuilder)
///
public class SqlMessageBuilder : AbstractMessageBuilder
{
///
/// 建構函式
///
public SqlMessageBuilder()
: base("sql")
{
}
///
/// 建造 Sql 插入方法
///
/// Message 實體物件
public override void BuilderInsert(MessageModel mm)
{
base._Operation["insert"] = "SqlMessage|Insert|" + mm.Message + "|" + mm.PublishTime.ToString() + "";
}
///
/// 建造 Sql 獲取方法
///
public override void BuilderGet()
{
base._Operation["get"] = "SqlMessage|Get";
}
}
}
BuilderInsert、BuilderGet 兩個建造步驟,確保流程一致。Operation 類別封裝執行指令字串,作為最終產品。Operation 內部用 Dictionary<string, string> 儲存不同操作的指令字串。抽象建造者與具體建造者的分離,使系統易於新增新的建造者(如 JSONMessageBuilder),符合開放封閉原則。