ファクトリパターンとその応用

Factory-Pattern

今日のトピックは「ファクトリパターンとその応用」です。ファクトリパターンは、オブジェクト指向設計におけるデザインパターンの一つで、オブジェクトの生成をカプセル化するために使用されます。このパターンを使うことで、インスタンス化のロジックを柔軟に変更でき、コードの再利用性と保守性が向上します。

目次

基本概念の説明

ファクトリパターン (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環境に最適

まとめ

ファクトリパターンは、オブジェクトの生成をカプセル化し、コードの柔軟性と保守性を向上させるための重要なデザインパターンです。このパターンを応用することで、システム全体の拡張性を高めることができます。次回は「抽象ファクトリパターンの実装」について学習しましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (1件)

コメントする

目次