Java中級

中級 Javaで学ぶデザインパターン|練習問題編

導入

デザインパターンは、ソフトウェア開発において再利用可能な解決策を提供する重要な手法です。中級エンジニアにとって、実務で直面する具体的なシチュエーションに基づいたパターンの理解が求められます。本記事では、特に「ファクトリーパターン」に焦点を当て、実際の業務での適用例を通じてそのメリットと落とし穴を探ります。

教科書レベルの解説(デザインパターン)

重要な概念の整理

ファクトリーパターンは、オブジェクトの生成を専門化するためのデザインパターンです。具体的には、インスタンス化のロジックをカプセル化し、クライアントコードからその詳細を隠蔽します。このアプローチにより、コードの柔軟性と拡張性が向上します。また、異なる実装を持つオブジェクトを簡単に切り替えることが可能になります。

コード例(Java)


interface Product {
    void use();
}

class ConcreteProductA implements Product {
    public void use() {
        System.out.println("Using ConcreteProductA");
    }
}

class ConcreteProductB implements Product {
    public void use() {
        System.out.println("Using ConcreteProductB");
    }
}

class ProductFactory {
    public static Product createProduct(String type) {
        if (type.equals("A")) {
            return new ConcreteProductA();
        } else if (type.equals("B")) {
            return new ConcreteProductB();
        }
        return null;
    }
}

public class Main {
    public static void main(String[] args) {
        Product productA = ProductFactory.createProduct("A");
        productA.use();
        
        Product productB = ProductFactory.createProduct("B");
        productB.use();
    }
}

コードの行ごとの解説

  1. interface Product { ... } – 製品の共通インターフェースを定義します。
  2. class ConcreteProductA implements Product { ... } – 具体的な製品Aの実装を提供します。
  3. class ConcreteProductB implements Product { ... } – 具体的な製品Bの実装を提供します。
  4. class ProductFactory { ... } – 製品を生成するファクトリークラスです。
  5. public static Product createProduct(String type) { ... } – 製品の種類に応じて適切なインスタンスを生成します。
  6. Product productA = ProductFactory.createProduct("A"); – 製品Aのインスタンスを生成します。
  7. productA.use(); – 製品Aを使用します。

練習問題編

以下にファクトリーパターンに関する練習問題を用意しました。各問題に対する模範解答と解説も併せて示します。

  1. 問題1: ファクトリーパターンを使用して、異なるタイプの動物(犬、猫)を生成するクラスを作成してください。
  2. 模範解答:
    
    interface Animal {
        void speak();
    }
    
    class Dog implements Animal {
        public void speak() {
            System.out.println("Woof");
        }
    }
    
    class Cat implements Animal {
        public void speak() {
            System.out.println("Meow");
        }
    }
    
    class AnimalFactory {
        public static Animal createAnimal(String type) {
            if (type.equals("Dog")) {
                return new Dog();
            } else if (type.equals("Cat")) {
                return new Cat();
            }
            return null;
        }
    }
    
  3. 問題2: 生成された動物のインスタンスを使って、各動物の鳴き声を出力するプログラムを作成してください。
  4. 模範解答:
    
    public class Main {
        public static void main(String[] args) {
            Animal dog = AnimalFactory.createAnimal("Dog");
            dog.speak();
            
            Animal cat = AnimalFactory.createAnimal("Cat");
            cat.speak();
        }
    }
    
  5. 問題3: ファクトリーパターンの利点と欠点をそれぞれ1つずつ挙げてください。
  6. 模範解答:
    • 利点: オブジェクト生成の柔軟性が向上し、クライアントコードが具体的なクラスに依存しなくなります。
    • 欠点: 新しい製品を追加する際にファクトリーメソッドを変更する必要があるため、変更が必要な場合は影響範囲が広がります。

まとめ

  • ファクトリーパターンは、オブジェクト生成を専門化することで、コードの再利用性と拡張性を高めます。
  • 具体的な製品の実装をクライアントから隠蔽することで、実装の変更が容易になります。
  • 実際の業務においては、適切な設計を行うことで、複雑なシステムでも柔軟に対応できるようになります。