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


GoF:Abstract Factory

公開:2026.06.01(月) 00:06

Abstract Factory

Abstract Factory(アブストラクトファクトリー)は、関連するオブジェクト群(ファミリー)を具体的なクラスを指定せずに生成するためのデザインパターンです。Visual Basic(VB.NET)では、インターフェースやMustInherit(抽象クラス)を組み合わせて実装します。

構成要素

AbstractFactory(抽象工場)
製品群を生成するためのインターフェース

ConcreteFactory(具象工場)
AbstractFactoryを実装し、具体的な製品インスタンスを生成

AbstractProduct(抽象製品)
生成される製品のインターフェース

ConcreteProduct(具象製品)
AbstractProductの具体的な実装

Visual Basic(VB.NET)実装例

テーマ(Windows用/Mac用などのUI部品)ごとに一連のオブジェクトを作成する例です。
Module Module1

    ' 1. Abstract Products
    Public Interface IButton
        Sub Render()
    End Interface

    Public Interface ITextBox
        Sub Render()
    End Interface

    ' 2. Concrete Products (Windows)
    Public Class WindowsButton
        Implements IButton
        Public Sub Render() Implements IButton.Render
            Console.WriteLine("Windowsボタンを描画しました。")
        End Sub
    End Class

    Public Class WindowsTextBox
        Implements ITextBox
        Public Sub Render() Implements ITextBox.Render
            Console.WriteLine("Windowsテキストボックスを描画しました。")
        End Sub
    End Class

    ' 2. Concrete Products (Mac)
    Public Class MacButton
        Implements IButton
        Public Sub Render() Implements IButton.Render
            Console.WriteLine("Macボタンを描画しました。")
        End Sub
    End Class

    Public Class MacTextBox
        Implements ITextBox
        Public Sub Render() Implements ITextBox.Render
            Console.WriteLine("Macテキストボックスを描画しました。")
        End Sub
    End Class

    ' 3. Abstract Factory
    Public Interface IGUIFactory
        Function CreateButton() As IButton
            Function CreateTextBox() As ITextBox
    End Interface

    ' 4. Concrete Factories
    Public Class WindowsFactory
        Implements IGUIFactory
        Public Function CreateButton() As IButton Implements IGUIFactory.CreateButton
            Return New WindowsButton()
        End Function
        Public Function CreateTextBox() As ITextBox Implements IGUIFactory.CreateTextBox
            Return New WindowsTextBox()
        End Function
    End Class

    Public Class MacFactory
        Implements IGUIFactory
        Public Function CreateButton() As IButton Implements IGUIFactory.CreateButton
            Return New MacButton()
        End Function
        Public Function CreateTextBox() As ITextBox Implements IGUIFactory.CreateTextBox
            Return New MacTextBox()
        End Function
    End Class

    ' 5. Client
    Public Class Application
        Private _button As IButton
        Private _textBox As ITextBox

        Public Sub New(factory As IGUIFactory)
            _button = factory.CreateButton()
            _textBox = factory.CreateTextBox()
        End Sub

        Public Sub Paint()
            _button.Render()
            _textBox.Render()
        End Sub
    End Class

    ' 実行
    Public Sub Main()
        ' Windows環境向けのファクトリーを使用
        Dim factory As IGUIFactory = New WindowsFactory()
        Dim app As New Application(factory)
        app.Paint()

        ' Mac環境向けに切り替える場合も、クライアント側のコード変更は不要
        Dim factoryMac As IGUIFactory = New MacFactory()
        Dim appMac As New Application(factoryMac)
        appMac.Paint()
    End Sub

End Module


その他の記事