今日のトピックは「ファクトリパターンとその応用」です。ファクトリパターンは、オブジェクト指向設計におけるデザインパターンの一つで、オブジェクトの生成をカプセル化するために使用されます。このパターンを使うことで、インスタンス化のロジックを柔軟に変更でき、コードの再利用性と保守性が向上します。
目次
基本概念の説明
ファクトリパターン (Factory Pattern)
ファクトリパターンは、インスタンス化のプロセスをカプセル化し、クライアントコードが具体的なクラスに依存しないようにするデザインパターンです。これにより、新しいクラスのインスタンスを作成する際にコードの修正が最小限で済み、拡張性が向上します。
各言語でのサンプルコード
Python
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof"
class Cat(Animal):
def speak(self):
return "Meow"
class AnimalFactory:
@staticmethod
def create_animal(animal_type):
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()
else:
return None
# 使用例
animal = AnimalFactory.create_animal("dog")
print(animal.speak()) # Woof
C#
public abstract class Animal {
public abstract string Speak();
}
public class Dog : Animal {
public override string Speak() {
return "Woof";
}
}
public class Cat : Animal {
public override string Speak() {
return "Meow";
}
}
public class AnimalFactory {
public static Animal CreateAnimal(string animalType) {
switch (animalType.ToLower()) {
case "dog": return new Dog();
case "cat": return new Cat();
default: return null;
}
}
}
// 使用例
Animal animal = AnimalFactory.CreateAnimal("dog");
Console.WriteLine(animal.Speak()); // Woof
C++
#include <iostream>
#include <string>
class Animal {
public:
virtual std::string speak() const = 0;
};
class Dog : public Animal {
public:
std::string speak() const override {
return "Woof";
}
};
class Cat : public Animal {
public:
std::string speak() const override {
return "Meow";
}
};
class AnimalFactory {
public:
static Animal* createAnimal(const std::string& animalType) {
if (animalType == "dog") {
return new Dog();
} else if (animalType == "cat") {
return new Cat();
} else {
return nullptr;
}
}
};
// 使用例
int main() {
Animal* animal = AnimalFactory::createAnimal("dog");
if (animal) {
std::cout << animal->speak() << std::endl; // Woof
delete animal;
}
return 0;
}
Java
abstract class Animal {
abstract String speak();
}
class Dog extends Animal {
@Override
String speak() {
return "Woof";
}
}
class Cat extends Animal {
@Override
String speak() {
return "Meow";
}
}
class AnimalFactory {
public static Animal createAnimal(String animalType) {
if (animalType.equalsIgnoreCase("dog")) {
return new Dog();
} else if (animalType.equalsIgnoreCase("cat")) {
return new Cat();
} else {
return null;
}
}
}
// 使用例
public class Main {
public static void main(String[] args) {
Animal animal = AnimalFactory.createAnimal("dog");
System.out.println(animal.speak()); // Woof
}
}
JavaScript
class Dog {
speak() {
return "Woof";
}
}
class Cat {
speak() {
return "Meow";
}
}
class AnimalFactory {
static createAnimal(animalType) {
if (animalType === "dog") {
return new Dog();
} else if (animalType === "cat") {
return new Cat();
} else {
return null;
}
}
}
// 使用例
const animal = AnimalFactory.createAnimal("dog");
console.log(animal.speak()); // Woof
各言語の解説
言語 | ファクトリパターンの実装方法 | 特徴 |
---|---|---|
Python | 静的メソッドを使用してオブジェクトを生成 | シンプルで動的、柔軟性が高い |
C# | 静的ファクトリメソッドを使用 | 型安全で強力なデザインが可能 |
C++ | 静的メソッドでのインスタンス生成 | 高速で効率的、明示的なメモリ管理が必要 |
Java | 静的メソッドを使用してクラスのインスタンス化 | 強力な型安全性と拡張性を持つ |
JavaScript | クラスファクトリを使用 | 柔軟でシンプル、フロントエンドやNode.js環境に最適 |
まとめ
ファクトリパターンは、オブジェクトの生成をカプセル化し、コードの柔軟性と保守性を向上させるための重要なデザインパターンです。このパターンを応用することで、システム全体の拡張性を高めることができます。次回は「抽象ファクトリパターンの実装」について学習しましょう。
コメント
コメント一覧 (1件)
[…] 1-4-2. ファクトリパターンとその応用 […]