ファクトリパターンはデザインパターンの中でも特に汎用性が高く、フレームワーク・ライブラリ・業務アプリケーションなど幅広い場面で活用されています。
概念としての理解が進んでいても、実際にどのような場面でどのように使われているかを知ることで、自分のコードへの応用がぐっとしやすくなります。
本記事では、ファクトリパターンの実際の使用場面と具体的な応用例を豊富に紹介し、実務に直結する実践的な理解の習得を支援します。
GUI部品の生成、データベース接続、ファイル処理、フレームワーク設計など、様々な場面での活用例を通じて、ファクトリパターンの真の実用価値を理解してください。
ファクトリパターンが活躍する代表的な使用場面
それではまず、ファクトリパターンが実際の開発現場で活躍している代表的な使用場面について解説していきます。
ファクトリパターンは特定の業種・ドメインに限らず、ソフトウェア開発のあらゆる場面で登場します。
共通するのは「生成するオブジェクトの種類を柔軟に切り替えたい」「生成処理を一か所に集約したい」というニーズです。
データベース接続の抽象化と切り替え
ファクトリパターンの最もよく知られた応用例のひとつが、データベース接続の抽象化です。
多くの業務アプリケーションは開発環境・ステージング環境・本番環境で異なるデータベース(MySQL、PostgreSQL、SQLiteなど)を使用します。
ファクトリパターンを使用することで、環境設定に応じて適切なデータベース接続オブジェクトを生成するロジックを一か所に集約できます。
// データベースファクトリの応用例(Java)
public interface DatabaseFactory {
Connection createConnection(String url, String user, String pass);
QueryBuilder createQueryBuilder();
}
public class MySQLFactory implements DatabaseFactory {
public Connection createConnection(String url, String user, String pass) {
return DriverManager.getConnection(“jdbc:mysql://” + url, user, pass);
}
public QueryBuilder createQueryBuilder() {
return new MySQLQueryBuilder();
}
}
// 設定ファイルに応じてファクトリを切り替え
String dbType = config.get(“database.type”); // “mysql” or “postgresql”
DatabaseFactory factory = DatabaseFactoryRegistry.get(dbType);
このような設計により、本番環境をMySQLからPostgreSQLに変更する際も、設定ファイルの一行を書き換えるだけで対応できます。
JavaのJDBC APIやSpringのDataSourceは、まさにこのアプローチを採用した代表的なフレームワーク設計です。
GUI部品の生成と外観切り替え
GUIアプリケーション開発において、ファクトリパターンはプラットフォームや外観テーマに応じたUI部品の生成に効果的に活用されます。
WindowsとmacOSでは同じ「ボタン」でも見た目や動作が異なりますが、クライアントコードは同じインターフェースを通じて操作するため、プラットフォームの違いを意識する必要がありません。
JavaのSwingやAWTフレームワークでは、LookAndFeelという仕組みがAbstract Factoryパターンに近い形でUI部品の外観を一括管理しています。
テーマ切り替え機能(ダーク/ライトモード切り替えなど)の実装にも、ファクトリパターンが有効に機能します。
ファイル処理と複数フォーマットへの対応
CSVファイル、XMLファイル、JSONファイルなど複数のフォーマットを扱うアプリケーションでも、ファクトリパターンは非常に有効です。
ファイルの読み込み・書き込みを担うParserオブジェクトやWriterオブジェクトの生成をファクトリに任せることで、クライアントコードはフォーマットの種類を意識せずに処理を記述できます。
// ファイルパーサーファクトリの応用例(Java)
public interface FileParser {
List<Record> parse(InputStream input) throws IOException;
}
public class ParserFactory {
public static FileParser create(String fileName) {
if (fileName.endsWith(“.csv”)) return new CSVParser();
if (fileName.endsWith(“.xml”)) return new XMLParser();
if (fileName.endsWith(“.json”)) return new JSONParser();
throw new UnsupportedOperationException(“Unknown format”);
}
}
// クライアントコード
FileParser parser = ParserFactory.create(uploadedFile.getName());
List<Record> records = parser.parse(uploadedFile.getInputStream());
新しいファイルフォーマット(例:ExcelやParquet)への対応が必要になった際も、新しいParserクラスとファクトリへの登録追加だけで対応でき、既存クライアントコードへの影響はありません。
フレームワーク・ライブラリにおけるファクトリパターンの活用
続いては、主要なフレームワークやライブラリにおけるファクトリパターンの具体的な活用事例を確認していきます。
実際に広く使われているフレームワークの設計を学ぶことで、ファクトリパターンの実践的な使いどころとその効果を肌感覚で理解することができます。
JavaおよびC#の代表的なフレームワークでの活用例を見ていきましょう。
SpringフレームワークにおけるBeanFactory
JavaのSpringフレームワークにおけるBeanFactoryは、ファクトリパターンの実践的な応用例として非常に参考になります。
BeanFactoryはSpringのDIコンテナの根幹をなすインターフェースであり、XMLや注釈(アノテーション)による設定に基づいてBeanオブジェクトを生成・管理します。
ApplicationContextはBeanFactoryを拡張したインターフェースであり、より高度なBeanの管理機能を提供します。
開発者がBeanFactoryの実装クラスを直接意識することなく、インターフェース経由でBeanを取得できる設計は、まさにファクトリパターンの恩恵です。
Springの@Componentや@Beanアノテーションで登録されたクラスは、実行時にSpringのファクトリ機構によって適切に生成・注入されます。
ASP.NET CoreのDIコンテナとファクトリパターン
C#のASP.NET CoreフレームワークにもDIコンテナが組み込まれており、ファクトリパターンの概念が随所に活用されています。
IServiceFactoryやActivatorUtilitiesといったAPIを使用することで、DIコンテナ管理下でのファクトリ的なオブジェクト生成が可能です。
// ASP.NET CoreでのファクトリパターンとDI(C#)
// インターフェース登録
services.AddTransient<IEmailSender, SmtpEmailSender>();
// ファクトリ関数による動的生成
services.AddTransient<INotificationService>(sp => {
var config = sp.GetRequiredService<IConfiguration>();
return config[“Notification:Type”] == “email”
? new EmailNotificationService(sp.GetRequiredService<IEmailSender>())
: new SmsNotificationService(sp.GetRequiredService<ISmsClient>());
});
このように、DIコンテナのファクトリ関数を使うことで、実行時の設定値に応じて異なる実装クラスを動的に選択する柔軟な設計が実現できます。
ロギングフレームワークにおけるLoggerFactory
ロギングは多くのアプリケーションで必要とされる横断的関心事であり、ファクトリパターンが頻繁に活用される分野です。
JavaのSLF4JやLog4j、C#のMicrosoft.Extensions.LoggingはいずれもILoggerFactory(LoggerFactory)というファクトリインターフェースを提供しています。
クライアントコードはLoggerFactoryを通じてLoggerを取得するため、ログの出力先(ファイル・コンソール・クラウドログサービスなど)を変更する際もクライアントコードへの影響がありません。
| フレームワーク | ファクトリインターフェース | 活用場面 |
|---|---|---|
| Spring(Java) | BeanFactory、ApplicationContext | DI・Bean管理 |
| ASP.NET Core(C#) | IServiceFactory | DI・サービス生成 |
| SLF4J(Java) | ILoggerFactory | ロガー生成 |
| JUnit(Java) | TestFactory | テストケース動的生成 |
| Android(Java/Kotlin) | ViewModelFactory | ViewModel生成・DI |
ゲーム開発・組み込みシステムでの応用例
続いては、ゲーム開発や組み込みシステムといった特殊な開発分野でのファクトリパターンの応用例を確認していきます。
これらの分野でもファクトリパターンは重要な役割を果たしており、パターンの汎用性の高さを改めて実感できます。
具体的なゲームエンジン・組み込み設計での活用例を見ていきましょう。
ゲームにおけるキャラクター・オブジェクト生成
ゲーム開発では、キャラクター・敵・アイテムなどのゲームオブジェクトの生成にファクトリパターンが活躍します。
ゲームには多種多様なキャラクタータイプが存在し、プレイヤーの選択やゲームステージに応じて動的に生成する必要があります。
// ゲームキャラクターファクトリの例(Java)
public interface GameCharacter {
void attack();
int getHealth();
String getName();
}
public class CharacterFactory {
private static final Map<String, Supplier<GameCharacter>> registry = new HashMap<>();
static {
registry.put(“warrior”, Warrior::new);
registry.put(“mage”, Mage::new);
registry.put(“archer”, Archer::new);
}
public static GameCharacter create(String type) {
return registry.getOrDefault(type, () -> {
throw new IllegalArgumentException(“Unknown character: ” + type);
}).get();
}
}
ゲームの拡張(新キャラクター追加)の際も、CharacterFactoryのレジストリに追加登録するだけで既存ゲームロジックへの変更なしに新キャラクターが利用可能になります。
UnityやUnreal EngineなどのゲームエンジンのObject Poolingシステムにも、ファクトリパターンの考え方が活用されています。
組み込みシステムにおけるデバイスドライバの抽象化
組み込みシステム開発においても、ファクトリパターンはデバイスドライバの抽象化に有効に機能します。
異なるハードウェア構成(センサーの種類、通信インターフェースなど)に対して同一のアプリケーションコードで動作するシステムを構築する際に重宝します。
センサー種別(温度センサー・湿度センサー・圧力センサーなど)に応じたドライバオブジェクトをファクトリで生成することで、アプリケーション層がハードウェアの差異を吸収できます。
クロスプラットフォーム対応が求められる組み込み製品では、ファクトリパターンによるハードウェア依存部分の抽象化が設計の要となります。
マイクロサービスアーキテクチャでの活用
近年注目されているマイクロサービスアーキテクチャでも、ファクトリパターンは重要な役割を担っています。
外部サービスとの通信クライアント(REST・gRPC・メッセージキューなど)の生成にファクトリパターンを活用することで、通信プロトコルの変更に柔軟に対応できます。
サーキットブレーカー・リトライポリシーなどの信頼性パターンを組み込んだクライアントオブジェクトの生成においても、ファクトリパターンが有効に機能します。
テスト時には実際のサービスクライアントの代わりにモッククライアントをファクトリで生成する設計により、単体テストの独立性が保たれます。
まとめ
本記事では、ファクトリパターンの実際の使用場面と応用例を、データベース接続・GUI部品・ファイル処理・フレームワーク・ゲーム開発・組み込みシステムなど多岐にわたって解説しました。
ファクトリパターンはその汎用性の高さから、Spring・ASP.NET Core・ロギングフレームワークなど、現代の主要な開発フレームワークの設計に深く組み込まれています。
「オブジェクトの種類を実行時に決定したい」「生成処理を一か所に集約したい」「テストを容易にしたい」というニーズがある場面では、ファクトリパターンの導入を積極的に検討する価値があります。
実際のフレームワークや既存コードにおけるファクトリパターンの活用例を分析することで、パターンの理解と応用力がさらに深まるでしょう。
ぜひ本記事の応用例を参考に、自分の開発プロジェクトへのファクトリパターン活用を試みてください。