Builder
複雑なオブジェクトの構築過程を分離・順序化し、同じ構築プロセスで異なる表現形式(インスタンス)を作成できるデザインパターンです。
構成要素
Builder (抽象ビルダー)
ConcreteBuilder (具象ビルダー)
Director (ディレクター)
Product (製品)
オブジェクトを構築するための共通インターフェースを定義
ConcreteBuilder (具象ビルダー)
Builderを実装し、実際の構築手順と生成オブジェクトを管理
Director (ディレクター)
Builderを使って構築プロセスを順序立てて実行
Product (製品)
最終的に生成される複雑なオブジェクト
Visual Basic(VB.NET)実装例
メール生成の例
' Product: 生成されるオブジェクト
Public Class MailMessage
Public Property Sender As String
Public Property Recipient As String
Public Property Subject As String
Public Property Body As String
Public Sub Display()
Console.WriteLine($"From: {Sender}, To: {Recipient}, Subject: {Subject}")
End Sub
End Class
' Builder: 抽象ビルダー
Public MustInherit Class MailBuilder
Protected mail As New MailMessage()
Public MustOverride Sub BuildSender(sender As String)
Public MustOverride Sub BuildRecipient(recipient As String)
Public MustOverride Sub BuildContent(subject As String, body As String)
Public Overridable Function GetResult() As MailMessage
Return mail
End Function
End Class
' ConcreteBuilder: 具象ビルダー
Public Class HtmlMailBuilder
Inherits MailBuilder
Public Overrides Sub BuildSender(sender As String)
mail.Sender = $"{sender} "
End Sub
Public Overrides Sub BuildRecipient(recipient As String)
mail.Recipient = $"{recipient} "
End Sub
Public Overrides Sub BuildContent(subject As String, body As String)
mail.Subject = $"{subject}
"
mail.Body = $"{body}
"
End Sub
End Class
' Director: 構築プロセスの制御
Public Class MailDirector
Private builder As MailBuilder
Public Sub New(builder As MailBuilder)
Me.builder = builder
End Sub
Public Function Construct(sender As String, recipient As String, subject As String, body As String) As MailMessage
builder.BuildSender(sender)
builder.BuildRecipient(recipient)
builder.BuildContent(subject, body)
Return builder.GetResult()
End Function
End Class
' クライアントコード
Public Sub Main()
Dim builder As MailBuilder = New HtmlMailBuilder()
Dim director As New MailDirector(builder)
Dim htmlMail As MailMessage = director.Construct("alice@example.com", "bob@example.com", "Hello", "This is HTML body.")
htmlMail.Display()
End Sub
0 件のコメント:
コメントを投稿