💡

Java デザインパターン 僕なりの4つを説明②

2022/01/03に公開

こんにちは、mikeです。
前回に引き続き、Javaデザインパターンの話を進めていきます。
前回の記事を読んでいない方は、こちらから飛べるので見てみてください。

目次

  1. Factory パターン
  2. Builder パターン
     ↓今回はこっち
  3. Singleton パターン
  4. Facade パターン

本日もJavaデザインパターン徹底攻略に沿ってオブジェクト指向については知っているという前提のもと話を進めていきます。

3. Singletonパターン

あるクラスのオブジェクトを1個だけ作って共有したい時に使用します。
システムの起動から終了までの間に、そのクラスのオブジェクトが1個しか存在しないことを保証できるという利点があります。

普通のクラスではnewする(コンストラクタを呼ぶ)回数分のオブジェクトができます。しかし、システムの起動から終了まで1個のオブジェクトしか作りたくない特殊な場合があります。
そんな時に下記に示すコードでシングルトンを実現します。

//通常のコードでは、条件分岐を用いてインスタンスが生成済みなのかを判断する
 if ( もうオブジェクトを生成済みであれば ) {
    生成済みのオブジェクトを返す
 }else {
    新規のオブジェクトを生成し、それを返す
 }

class SingletonInstance {
    static SingletonInstance uniqueInstance;

    private SingletonInstance() {

    }

    static SingletonInstance getInstances() {
        if ( uniqueInstance == null ) {
            uniqueInstance = new SingletonInstance();
        }
        return uniqueInstance;
    }
}

public class SingletonMain {
    public static void main(String[] args) {
        SingletonInstance instance1 = SingletonInstance.getInstances();
        SingletonInstance instance2 = SingletonInstance.getInstances();
    }
}

シングルトンオブジェクトをクラス変数(Static変数)に格納することでグローバルな値にすします。
コンストラクタをPrivateにすることで不用意に直接コンストラクを呼び出してオブジェクトを生成することを防ぐ役割もあリます。

4. Facadeパターン

既存のクラスを複数組み合わせて使う手順を定石化したい時に使います。
既存のクラスの使い方のうち、汎用性の高いものを開発者間で共有し合うことで開発スピードを上げたり、バグを減らすことができます。

class MyLibraryA {
    String getISBNNumber() {
        return "44445555";
    }
}

class MyLibraryB {
    String getBookName(String ISBNNumber) {
        return "My Design Pattern Book";
    }
}

// LibrayA, Bをまとめたファサードクラス
class LibraryFacadeClass {
    String getBookName() {
        MyLibraryA libA = new MyLibraryA();
        MyLibraryB libB = new MyLibraryB();
        String isbn = libA.getISBNNumber();
        return libB.getBookName(isbn);
    }
}

public class FacadeMain {
    public static void main(String[] args) {
        // ファサードクラスを使わない場合
        MyLibraryA libA = new MyLibraryA();
        MyLibraryB libB = new MyLibraryB();
        String isbn = libA.getISBNNumber();
        String name = libB.getBookName(isbn);
        System.out.println(name);

        // ファサードクラスを使う場合
        LibraryFacadeClass libC = new LibraryFacadeClass();
        name = libC.getBookName();
        System.out.println(name);
    }
}

このように1つのPublicメソッドにして開発者間で公開しておいて繰り返し使えるようにすることが目的です。
LibraryFacadeClassが複雑かつ、汎用的的であればあるほど手順をまとめたファサードクラスの効果が高くなります。


簡単な説明のみになってしまいましたが、デザインパターンを知ることで保守性や開発スピードは上がると考えております。
ここで全てを語れるほどの実力がないので、今後実際に開発現場で使用してみて再度この投稿を精査したりしたいと思います。そしてコメントなどでご指摘をいただけると助かります。
また、デザインパターンについて気になった方は、新しくデザインパターンの本が出たのでそちらを買って読むのがおすすめだと思います。
最後まで読んでいただきありがとうございます。

Discussion