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での実装例を紹介し、パターンの利便性と柔軟性を理解しました。
これにより、クライアントコードが具体的なクラスに依存せずにオブジェクトを生成できるため、システムのメンテナンスや拡張が容易になります。