ファクトリパターン
オブジェクトの生成ロジックをカプセル化し、生成方法の詳細を隠蔽するデザインパターン
ファクトリパターンとは
ファクトリパターンは、オブジェクトの生成ロジックをカプセル化し、呼び出し側から生成方法の詳細を隠蔽するデザインパターンである。GoF デザインパターンの生成パターンに分類される。
ファクトリの種類
ファクトリの種類を以下にまとめる。
| 種類 | 説明 |
|---|---|
| Simple Factory | 条件分岐でオブジェクトを生成 |
| Factory Method | サブクラスが生成方法を決定 |
| Abstract Factory | 関連するオブジェクト群を生成 |
Simple Factory
Simple Factory のコード例を示す。
type NotificationType = 'email' | 'sms' | 'slack';
interface Notification {
send(message: string): Promise<void>;
}
function createNotification(type: NotificationType): Notification {
switch (type) {
case 'email': return new EmailNotification();
case 'sms': return new SmsNotification();
case 'slack': return new SlackNotification();
}
}
// 呼び出し側は具体的なクラスを知らない
const notification = createNotification('email');
await notification.send('Hello');
AWS サービスのファクトリ
AWS サービスのファクトリのコード例を示す。
// 環境に応じて異なるクライアントを生成
function createDbClient() {
const endpoint = process.env.DYNAMODB_ENDPOINT;
return endpoint
? new DynamoDBClient({ endpoint }) // ローカル開発
: new DynamoDBClient({}); // AWS 環境
}
ファクトリ関数 vs クラス
ファクトリ関数と クラス のコード例を比較する。
// ファクトリ関数 (TypeScript で推奨)
function createUser(name: string, role: string) {
return {
name,
role,
createdAt: new Date(),
isAdmin: () => role === 'admin',
};
}
// クラス (Java 的)
class User {
constructor(public name: string, public role: string) {}
isAdmin() { return this.role === 'admin'; }
}
TypeScript ではファクトリ関数の方がシンプルで、テストしやすい。
いつファクトリを使うか
いつファクトリを使うかの判断基準を以下にまとめる。
| ケース | 推奨 |
|---|---|
| 生成ロジックが複雑 | ✅ ファクトリ |
| 条件に応じて異なる型を返す | ✅ ファクトリ |
| 単純なオブジェクト生成 | ❌ 直接生成で十分 |
| テスト用のモックを差し替えたい | ✅ ファクトリ |
ファクトリパターンの背景や設計思想は関連書籍に詳しい。
この記事は役に立ちましたか?
関連用語
デザインパターン
ソフトウェア設計で繰り返し現れる問題に対する再利用可能な解決策のカタログ
抽象クラス
直接インスタンス化できず、サブクラスに共通のインターフェースと部分的な実装を提供するクラス
コンポジション
オブジェクトを組み合わせて機能を構築する設計手法で、継承よりも柔軟性が高い
Builder パターン
複雑なオブジェクトの生成をメソッドチェーンで段階的に構築するデザインパターン
エンティティと値オブジェクト
DDD における 2 つの基本的なドメインモデル要素 - 同一性で区別するエンティティと、値で区別する値オブジェクト
Flyweight パターン
多数のオブジェクト間で共有可能な状態を分離し、メモリ使用量を削減するデザインパターン
関連する記事
あの有名 OSS のコードは、この本の影響を受けている
広く使われているオープンソースソフトウェアの設計には、特定の技術書の影響が色濃く反映されています。OSS のコードと技術書の関係を知ると、両方の理解が深まります。
コードを「書く力」と「読む力」は別物 - 読解力を鍛える技術書の使い方
プログラミングの「書く力」ばかり鍛えていませんか。他人のコードを正確に読み解く力は、技術書を使って意識的に鍛えられます。読解力を高める具体的な方法を紹介。
リーダブルコードの次に読む本 - ステップアップの読書ルート
リーダブルコードを読み終えた後、設計力を段階的に高めるための読書ルートと、各レベルで学ぶべきテーマを紹介します。