こんにちは!今日はTypeScriptを使用してGoF(Gang of Four)のファクトリパターンを解説します。この記事では、基本的なファクトリパターンから抽象ファクトリパターンまで、具体的なコードサンプルを交えて説明します。デザインパターン初心者の方でも理解しやすいように詳しく解説しますので、ぜひ最後までお読みください。
目次
ファクトリパターンとは
ファクトリパターンは、クラスのインスタンス生成を専門の「ファクトリ」クラスに委ねることで、オブジェクトの作成とその使用を分離するデザインパターンです。
基本的なファクトリパターン
まずは基本的なファクトリパターンから見ていきましょう。以下の例は、Toy
とBook
という異なる2つのタイプの製品を生成するシンプルなProductFactory
です。
interface Product {
description: string;
}
class Toy implements Product {
description = 'A toy';
}
class Book implements Product {
description = 'A book';
}
class ProductFactory {
createProduct(type: string): Product {
if (type === 'toy') {
return new Toy();
}
if (type === 'book') {
return new Book();
}
throw new Error('Invalid product type');
}
}
抽象ファクトリパターン
次に、より進んだファクトリパターン、具体的には「抽象ファクトリパターン」を見てみましょう。以下の例では、異なるAPIエンドポイントにリクエストを行うためのクライアントを生成するファクトリを作成します。
interface ApiClient {
get: (path: string) => Promise<any>;
}
class UserApiClient implements ApiClient {
get = async (path: string) => {
// User APIに関するリクエスト処理
console.log(`User API request to ${path}`);
};
}
class ProductApiClient implements ApiClient {
get = async (path: string) => {
// Product APIに関するリクエスト処理
console.log(`Product API request to ${path}`);
};
}
interface ApiClientFactory {
createApiClient(): ApiClient;
}
class UserApiClientFactory implements ApiClientFactory {
createApiClient(): ApiClient {
return new UserApiClient();
}
}
class ProductApiClientFactory implements ApiClientFactory {
createApiClient(): ApiClient {
return new ProductApiClient();
}
}
// 使用例
let factory: ApiClientFactory = new UserApiClientFactory();
let apiClient = factory.createApiClient();
apiClient.get('/users');
factory = new ProductApiClientFactory();
apiClient = factory.createApiClient();
apiClient.get('/products');
まとめ
以上が、TypeScriptでのGoFのファクトリパターンの解説でした。このパターンは、オブジェクトの作成をカプセル化することで、システムのフレキシビリティと再利用性を高める役割を果たします。具体的なクラスのインスタンスを作成する責任をファクトリクラスが担うことで、コードの依存性が減少し、メンテナンスが容易になります。
初心者から上級者まで、これからTypeScriptでファクトリパターンを使ってみようと考えている方々が何か参考になれば幸いです。お読みいただきありがとうございました!
以上です!いいねとコメントは励みになりますので、よろしければお願いします。また質問やコメントもお気軽にどうぞ!