Abstract Factoryパターンとは | GoFデザインパターン

記事内に広告が含まれています。

Abstract Factoryパターンは、オブジェクト指向プログラミングにおけるデザインパターンの一つで、特定のクラスを指定することなく関連するオブジェクト群を生成するためのインターフェースを提供します。

このパターンは、複雑なオブジェクト構築を簡略化し、クライアントコードの柔軟性を向上させます。

この記事では、Abstract Factoryパターンの基本概念、使い方、そしてJava、C++、C#、VB.NETでの実装例を紹介します。

Abstract Factoryパターンとは

Abstract Factoryパターンは、オブジェクトの生成に関わる設計パターンです。

このパターンを使用することで、複数の関連オブジェクトを生成する際に、クライアントが具体的なクラスを意識せずに生成できます。

これは、依存関係を減らし、コードの柔軟性と拡張性を高めることを目的としています。

Abstract Factoryパターンの特徴

Abstract Factoryパターンは、複数の関連オブジェクトを生成する場合に適しています。

各オブジェクトの生成過程が複雑であったり、製品の種類が複数に分かれている場合に特に有効です。

具体的な実装クラスを指定せずに、ファミリ全体を生成するためのインターフェースを提供します。

Abstract Factoryパターンの使い方

Abstract Factoryパターンを実装するためには、まずインターフェースや抽象クラスを定義し、その中でオブジェクトを生成するメソッドを宣言します。

具体的なファクトリクラスは、このインターフェースを実装し、実際にオブジェクトを生成します。

これにより、クライアント側では具体的な生成方法を知らずにオブジェクトを生成できます。

クラス構成

Abstract Factoryパターンには以下のクラスが含まれます:

  • AbstractFactory:オブジェクト生成のためのインターフェース。
  • ConcreteFactory:AbstractFactoryを実装した具体的なファクトリ。
  • AbstractProduct:生成されるオブジェクトのインターフェース。
  • ConcreteProduct:具体的なオブジェクト。
  • Client:ファクトリを使用してオブジェクトを生成するクライアント。

Abstract Factoryパターン実装サンプル

ここでは、Java、C++、C#、VB.NETでのAbstract Factoryパターンの実装例を紹介します。

Javaでの実装

以下は、JavaでのAbstract Factoryパターンの実装例です。


// AbstractFactory
public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

// ConcreteFactory1
public class WinFactory implements GUIFactory {
    public Button createButton() {
        return new WinButton();
    }
    public Checkbox createCheckbox() {
        return new WinCheckbox();
    }
}

// ConcreteFactory2
public class MacFactory implements GUIFactory {
    public Button createButton() {
        return new MacButton();
    }
    public Checkbox createCheckbox() {
        return new MacCheckbox();
    }
}

// AbstractProduct
public interface Button {
    void paint();
}

// ConcreteProduct1
public class WinButton implements Button {
    public void paint() {
        System.out.println("Windows Button");
    }
}

// ConcreteProduct2
public class MacButton implements Button {
    public void paint() {
        System.out.println("Mac Button");
    }
}

// Client
public class Application {
    private Button button;
    public Application(GUIFactory factory) {
        button = factory.createButton();
    }
    public void paint() {
        button.paint();
    }
}

public class Demo {
    public static void main(String[] args) {
        GUIFactory factory = new WinFactory();
        Application app = new Application(factory);
        app.paint();
    }
}

C++での実装

以下は、C++でのAbstract Factoryパターンの実装例です。


#include 
using namespace std;

// AbstractFactory
class GUIFactory {
public:
    virtual void createButton() = 0;
    virtual void createCheckbox() = 0;
};

// ConcreteFactory1
class WinFactory : public GUIFactory {
public:
    void createButton() {
        cout << "Windows Button" << endl;
    }
    void createCheckbox() {
        cout << "Windows Checkbox" << endl;
    }
};

// ConcreteFactory2
class MacFactory : public GUIFactory {
public:
    void createButton() {
        cout << "Mac Button" << endl;
    }
    void createCheckbox() {
        cout << "Mac Checkbox" << endl;
    }
};

// Client
class Application {
private:
    GUIFactory* factory;
public:
    Application(GUIFactory* f) : factory(f) {}
    void paint() {
        factory->createButton();
    }
};

int main() {
    GUIFactory* factory = new WinFactory();
    Application app(factory);
    app.paint();
    return 0;
}

C#での実装

以下は、C#でのAbstract Factoryパターンの実装例です。


// AbstractFactory
public interface GUIFactory {
    Button CreateButton();
    Checkbox CreateCheckbox();
}

// ConcreteFactory1
public class WinFactory : GUIFactory {
    public Button CreateButton() {
        return new WinButton();
    }
    public Checkbox CreateCheckbox() {
        return new WinCheckbox();
    }
}

// ConcreteFactory2
public class MacFactory : GUIFactory {
    public Button CreateButton() {
        return new MacButton();
    }
    public Checkbox CreateCheckbox() {
        return new MacCheckbox();
    }
}

// AbstractProduct
public interface Button {
    void Paint();
}

// ConcreteProduct1
public class WinButton : Button {
    public void Paint() {
        Console.WriteLine("Windows Button");
    }
}

// ConcreteProduct2
public class MacButton : Button {
    public void Paint() {
        Console.WriteLine("Mac Button");
    }
}

// Client
public class Application {
    private Button button;
    public Application(GUIFactory factory) {
        button = factory.CreateButton();
    }
    public void Paint() {
        button.Paint();
    }
}

public class Demo {
    public static void Main(string[] args) {
        GUIFactory factory = new WinFactory();
        Application app = new Application(factory);
        app.Paint();
    }
}

VB.NETでの実装

以下は、VB.NETでのAbstract Factoryパターンの実装例です。


' AbstractFactory
Public Interface GUIFactory
    Function CreateButton() As Button
    Function CreateCheckbox() As Checkbox
End Interface

' ConcreteFactory1
Public Class WinFactory
    Implements GUIFactory
    Public Function CreateButton() As Button Implements GUIFactory.CreateButton
        Return New WinButton()
    End Function
    Public Function CreateCheckbox() As Checkbox Implements GUIFactory.CreateCheckbox
        Return New WinCheckbox()
    End Function
End Class

' ConcreteFactory2
Public Class MacFactory
    Implements GUIFactory
    Public Function CreateButton() As Button Implements GUIFactory.CreateButton
        Return New MacButton()
    End Function
    Public Function CreateCheckbox() As Checkbox Implements GUIFactory.CreateCheckbox
        Return New MacCheckbox()
    End Function
End Class

' AbstractProduct
Public Interface Button
    Sub Paint()
End Interface

' ConcreteProduct1
Public Class WinButton
    Implements Button
    Public Sub Paint() Implements Button.Paint
        Console.WriteLine("Windows Button")
    End Sub
End Class

' ConcreteProduct2
Public Class MacButton
    Implements Button
    Public Sub Paint() Implements Button.Paint
        Console.WriteLine("Mac Button")
    End Sub
End Class

' Client
Public Class Application
    Private button As Button
    Public Sub New(factory As GUIFactory)
        button = factory.CreateButton()
    End Sub
    Public Sub Paint()
        button.Paint()
    End Sub
End Class

Module Demo
    Sub Main()
        Dim factory As GUIFactory = New WinFactory()
        Dim app As New Application(factory)
        app.Paint()
    End Sub
End Module

まとめ

Abstract Factoryパターンは、複雑なオブジェクトの生成を抽象化し、クライアントコードの柔軟性を向上させる優れたデザインパターンです。

本記事では、Java、C++、C#、VB.NETでの実装例を紹介し、パターンの利便性と柔軟性を理解しました。

これにより、クライアントコードが具体的なクラスに依存せずにオブジェクトを生成できるため、システムのメンテナンスや拡張が容易になります。

オブジェクト指向プログラミングにおけるGoFの23のデザインパターン
デザインパターンは、ソフトウェア設計の問題を効果的に解決するための再利用可能な解決策です。本記事では、GoF(Gang ...
【PR】
オブジェクト指向学習におすすめの本
オブジェクト指向
スポンサーリンク
タイトルとURLをコピーしました