Java上級

上級 Javaで実装するデザインパターン実践集|練習問題編

導入

デザインパターンは、ソフトウェア開発における問題解決のためのテンプレートとして広く用いられています。特に、Javaを使用した実装においては、デザインパターンを活用することでコードの保守性や拡張性を高めることが可能です。本記事では、実務で遭遇するシチュエーションを基に、デザインパターンの実践的な利用方法を考察します。

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

重要な概念の整理

デザインパターンは大きく分けて、生成に関するパターン、構造に関するパターン、振る舞いに関するパターンの3つのカテゴリに分類されます。実際の業務では、これらのパターンを適切に選択し、状況に応じて組み合わせることが求められます。特に、構造に関するパターンは、クラス間の関係を整理し、コードの可読性を向上させるために重要です。

コード例(Java)


interface Shape {
    void draw();
}

class Circle implements Shape {
    public void draw() {
        System.out.println("Circle drawn");
    }
}

class Square implements Shape {
    public void draw() {
        System.out.println("Square drawn");
    }
}

class ShapeFactory {
    public static Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.getShape("CIRCLE");
        circle.draw();
        
        Shape square = ShapeFactory.getShape("SQUARE");
        square.draw();
    }
}

コードの行ごとの解説

  1. interface Shape {} – Shapeインターフェースを定義し、描画メソッドを宣言。
  2. class Circle implements Shape {} – CircleクラスがShapeインターフェースを実装し、描画メソッドを具体化。
  3. class Square implements Shape {} – Squareクラスも同様にShapeインターフェースを実装。
  4. class ShapeFactory {} – Shapeオブジェクトを生成するファクトリクラス。
  5. public static Shape getShape(String shapeType) {} – 引数に基づいて適切なShapeオブジェクトを返すメソッド。
  6. public static void main(String[] args) {} – プログラムのエントリポイント。ファクトリを使用してShapeオブジェクトを生成し、描画メソッドを呼び出す。

練習問題編

以下の練習問題に取り組んで、デザインパターンの理解を深めてください。

  1. 問題1: ShapeFactoryクラスに三角形を追加するためのコードを記述し、実行結果を示してください。
  2. 問題2: Shapeインターフェースに色を指定するメソッドを追加し、CircleとSquareクラスで実装してください。
  3. 問題3: Factory Methodパターンを使用して、Shapeオブジェクトを生成する別のファクトリクラスを作成してください。
  4. 問題4: 生成されたShapeオブジェクトのリストを管理するクラスを作成し、全てのShapeを描画するメソッドを実装してください。
  5. 問題5: それぞれのShapeに対して面積を計算するメソッドを追加し、CircleとSquareでの実装を示してください。

まとめ

  • デザインパターンを実務において効果的に活用することで、コードの可読性と保守性を向上させることが可能です。
  • 具体的なシチュエーションに基づいたパターンの選択が、実装の質を大きく左右します。