Factory Methodとは
Factory Method(ファクトリメソッド)は、オブジェクト指向デザインパターンの一つで、オブジェクトの生成のためのインターフェースを定義するものです。
このパターンのコアは、インスタンスを作成する責任をサブクラスに委譲することです。これにより、クライアントは具体的なクラスを知ることなく、オブジェクトを作成することができるようになります。
Factory Methodの実装例
以下はGolangでのFactory Methodの実装例です。
package main
import "fmt"
// Animalインターフェース
type Animal interface {
Speak() string
}
type Dog struct{}
func (d *Dog) Speak() string {
return "Woof!"
}
type Cat struct{}
func (c *Cat) Speak() string {
return "Meow!"
}
// AnimalFactoryインターフェース
type AnimalFactory interface {
CreateAnimal() Animal
}
type DogFactory struct{}
func (df *DogFactory) CreateAnimal() Animal {
return &Dog{}
}
type CatFactory struct{}
func (cf *CatFactory) CreateAnimal() Animal {
return &Cat{}
}
func main() {
var factory AnimalFactory
// DogFactoryを使う
factory = &DogFactory{}
dog := factory.CreateAnimal()
fmt.Println(dog.Speak()) // Woof!
// CatFactoryを使う
factory = &CatFactory{}
cat := factory.CreateAnimal()
fmt.Println(cat.Speak()) // Meow!
}
動物の鳴き声を表現する例:
Animal
インターフェースがあり、Speak()
メソッドを持っています。Dog
とCat
の2つの具体的な動物がAnimal
インターフェースを実装します。AnimalFactory
インターフェースがCreateAnimal()
メソッドを持ち、動物を作成します。- 具体的なファクトリ、
DogFactory
とCatFactory
がAnimalFactory
インターフェースを実装します。
Factory Methodが使われる具体的なケース
- データベース接続: アプリケーションが異なるデータベースシステム(MySQL, PostgreSQL, SQLiteなど)と接続する必要がある場合、Factory Methodを使って適切なデータベース接続を生成することができます。
- ユーザーロールに基づく表示: システムにはさまざまなユーザーロール(例: 管理者、エンドユーザー、ゲストなど)が存在する場合、これらのロールに応じて異なるダッシュボードやページのビューを提供することが考えられます。Factory Methodはロールに基づいて適切なビューオブジェクトを生成します。
- デバイスやブラウザの違いを考慮したレンダリング: ユーザーが使用しているデバイス(デスクトップ、モバイル、タブレット)やブラウザ(Chrome、Firefox、Safari)に応じて、異なるレンダリングや動作が必要な場合、Factory Methodで適切なレンダリングエンジンやビューコンポーネントを生成します。
このように、Factory Methodは異なる実装や状況に応じて特定のオブジェクトを生成する必要があるときに特に有用です。