Gof:Prototypeパターン

公開:2026.06.01(月) 03:25

Prototypeパターン

Prototypeパターンは、既存のインスタンスをコピー(複製)して新しいオブジェクトを生成するデザインパターンです。同じオブジェクトを何度もnewで生成するコストが高い場合や、生成処理が複雑な場合に役立ちます。

構成要素

Prototype(抽象クラス/インターフェース)
インスタンスを複製するためのメソッド(例:Clone)を定義します

ConcretePrototype(具象クラス)
実際に複製されるクラスで、Cloneメソッドの具体的な処理を実装します

Visual Basic(VB.NET)実装例

' 1. Prototype インターフェース
Public Interface IPrototype
    Function Clone() As IPrototype
End Interface

' 2. ConcretePrototype クラス
Public Class ConcretePrototype
    Implements IPrototype

    Public Property Name As String
    Public Property Value As Integer

    Public Sub New(name As String, value As Integer)
        Me.Name = name
        Me.Value = value
    End Sub

    ' 自身の複製を返すメソッド
    Public Function Clone() As IPrototype Implements IPrototype.Clone
        ' 浅いコピー(MemberwiseClone)を作成
        Return CType(Me.MemberwiseClone(), IPrototype)
    End Function

    Public Sub ShowInfo()
        Console.WriteLine($"Name: {Name}, Value: {Value}")
    End Sub
End Class

' 3. クライアント側での使用例
Public Module Module1
    Public Sub Main()
        ' オリジナルのインスタンスを作成
        Dim original As New ConcretePrototype("Original", 100)
        original.ShowInfo()

        ' インスタンスを複製(Prototypeパターン)
        Dim cloneObj As ConcretePrototype = CType(original.Clone(), ConcretePrototype)
        cloneObj.Name = "Cloned" ' 複製された方のプロパティを変更

        ' 結果の確認
        cloneObj.ShowInfo() ' Valueは100が引き継がれている
    End Sub
End Module
※ VB.NETでは、Object.MemberwiseCloneメソッドを使用すると、クラスの現在のインスタンスの簡易コピー(浅いコピー)を簡単に作成できます。


GoF:Factory

公開:2026.06.01(月) 00:36

Factory

GoFのFactory Method(ファクトリーメソッド)は、オブジェクトの生成処理をサブクラスに委譲するデザインパターンです。オブジェクトを生成する「工場(ファクトリー)」の枠組みを親クラスで定義し、具体的な生成を子クラスで行うことで、柔軟性と拡張性を高めます。

・結合度の低下: クラスを利用する側が「どの具体的なクラスをインスタンス化するか」を直接知る必要がなくなります。
・拡張性の向上: 新しい種類の製品(例:InvoiceDocument)を追加したい場合、既存のコードを変更せず、新しい製品クラスとそれに対応するクリエイタークラスを追加するだけで済みます。

Visual Basic(VB.NET)実装例

共通のインターフェースを持つ異なるドキュメント(レポートと履歴書)を、それぞれのファクトリークラスで生成する例です。
Module Module1

    ' 1. 製品のインターフェース
    Public Interface IDocument
        Sub Show()
    End Interface

    ' 2. 具体的な製品A
    Public Class ReportDocument
        Implements IDocument
        Public Sub Show() Implements IDocument.Show
            Console.WriteLine("レポートドキュメントを作成しました。")
        End Sub
    End Class

    ' 3. 具体的な製品B
    Public Class ResumeDocument
        Implements IDocument
        Public Sub Show() Implements IDocument.Show
            Console.WriteLine("履歴書ドキュメントを作成しました。")
        End Sub
    End Class

    ' 4. 生成を司る抽象クラス(Factory Method パターンの核)
    Public MustInherit Class DocumentCreator
        ' サブクラスに実装させる生成メソッド
        Protected MustOverride Function FactoryMethod() As IDocument

        ' インスタンスの生成を利用する処理
        Public Sub DoSomething()
            Dim doc As IDocument = FactoryMethod()
            Console.WriteLine("ドキュメントの処理を開始します。")
            doc.Show()
        End Sub
    End Class

    ' 5. 具体的な生成者A(レポート用)
    Public Class ReportCreator
        Inherits DocumentCreator
        Protected Overrides Function FactoryMethod() As IDocument
            Return New ReportDocument()
        End Function
    End Class

    ' 6. 具体的な生成者B(履歴書用)
    Public Class ResumeCreator
        Inherits DocumentCreator
        Protected Overrides Function FactoryMethod() As IDocument
            Return New ResumeDocument()
        End Function
    End Class

    ' 実行テスト
    Public Sub Test()
        ' レポートを作成するファクトリーを使用
        Dim creatorA As DocumentCreator = New ReportCreator()
        creatorA.DoSomething()

        ' 履歴書を作成するファクトリーを使用
        Dim creatorB As DocumentCreator = New ResumeCreator()
        creatorB.DoSomething()
    End Sub

End Module


GoF:Builder

公開:2026.06.01(月) 00:18

Builder

複雑なオブジェクトの構築過程を分離・順序化し、同じ構築プロセスで異なる表現形式(インスタンス)を作成できるデザインパターンです。

構成要素

Builder (抽象ビルダー)
オブジェクトを構築するための共通インターフェースを定義

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


その他の記事