Java デザインパターン 〜シングルトン パターン〜

Androidアプリ作成の予備知識として、オブジェクト指向、クラスの組み合わせ方の王道としてデザインパターンに関して記載していきます。

作成したコードは、Gitにアップしてあります。

シングルトン

シングルトンパターンは、一個のオブジェクトを共有したい時に使用します。
つまり、プログラムが起動している最中では1つだけ存在するオブジェクト(クラス)になります。

例えば、共通で使用するデータを保持する役目をこのクラスに持たせようとした時に便利は実装方法です。
文言だけではイマイチ。。。なのでコードを交えて記載します。

シングルトンサンプル

実行結果は下のようになります。

Mainクラス
Singletonクラス

処理概要

シングルトンクラス(SingletonCls)を定義しておきます。

public class SingletonCls {
    /** このクラスのインスタンス */
    private static SingletonCls instance;
    /** 設定情報1 */
    private int setting1;
    /** 設定情報2 */
    private String setting2;

    public static SingletonCls getInstance() {
        if (instance == null) {
            instance = new SingletonCls();
        }
        return instance;
    }

    /** コンストラクタは外部から参照不可 */
    private SingletonCls() {
    }

    /**
     * @return the setting1
     */
    public int getSetting1() {
        return setting1;
    }

    /**
     * @param setting1 the setting1 to set
     */
    public void setSetting1(int setting1) {
        this.setting1 = setting1;
    }

    /**
     * @return the setting2
     */
    public String getSetting2() {
        return setting2;
    }

    /**
     * @param setting2 the setting2 to set
     */
    public void setSetting2(String setting2) {
        this.setting2 = setting2;
    }
}

このクラスをMainメソッドから呼び出して使用します。

public class SingletonMain {
    public static void main(String[] args) {
        SingletonMain main = new SingletonMain();
        // シングルトンクラスを取得する(メソッドのstatic呼び出し)
        SingletonCls single = SingletonCls.getInstance();
        single.setSetting1(12);
        single.setSetting2("設定情報2");

        // 設定情報を表示する
        main.showSetting();

        // 設定情報を変更する
        single.setSetting1(99);
        single.setSetting2("こんばんは");

        // 設定情報を表示する
        main.showSetting();
    }

    /** 設定情報を表示する */
    public void showSetting() {
        SingletonCls single = SingletonCls.getInstance();
        System.out.println("**** 設定情報 *****");
        System.out.println("設定情報1: " + single.getSetting1());
        System.out.println("設定情報2: " + single.getSetting2());
        System.out.println("*****************");
    }
}

シングルトンクラスは、getInstance()でしかインスタンスが取得できないように作っています。

public static SingletonCls getInstance() {
    if (instance == null) {
        instance = new SingletonCls();
    }
    return instance;
}

/** コンストラクタは外部から参照不可 */
private SingletonCls() {
}

まとめ

上のように、シングルトンクラスはインスタンスが1つなので、常に保持している値が(各フィールドごとに)1つになります。なので、処理をしている最中に「設定情報」などを変更して何かしらの処理を行う時には便利は実装方法です。
他にも、アイディア次第でいろんなことができます。

余談

これがシングルトンでない場合は。。。
インスタンスが別々になるので、上のコードshowSetting()に引数を与えるとか他の方法をとる必要があります。

/** 設定情報を表示する */
public void showSetting() {
    // この部分を変更する必要がある
    SingletonCls single = SingletonCls.getInstance();
    System.out.println("**** 設定情報 *****");
    System.out.println("設定情報1: " + single.getSetting1());
    System.out.println("設定情報2: " + single.getSetting2());
    System.out.println("*****************");
}

シングルトンの場合は、getInstance()で(static呼び出しなので)いつでも設定情報を持っているインスタンスを取得できますが、これをシングルトンではない実装にするときは下のようになります。

実装は下のようになりました。

//// シングルトンではないパターン ////
NoSingletonCls noSingle = main.new NoSingletonCls();
// インナークラスなので参照可能、普通はこんな実装をしない
noSingle.setting1 = 1;
noSingle.setSetting2("内部設定");
main.showInnerSetting(noSingle);
// 値を変更する
noSingle.setSetting1(33);
noSingle.setSetting2("内部情報123");
main.showInnerSetting(noSingle);

とりあえずは、インスタンスを毎回作成する必要があるので、この部分が無駄になるわけです。
シングルトンは1つなので余計なPCリソース(メモリなど)を使用しなくて良いので、経済的な実装方法です(笑)

でわでわ。。。



関連ページ一覧

Eclipse セットアップ

Java Install Eclipse~開発ツールのインストール~

TensorFlow C++環境~EclipseにCDTをインストール~

Setup OpenGL with Java~JOGLを使う準備 for Eclipse~

Eclipse Meven 開発手順~プロジェクトの作成~

Java OpenCV 環境セットアップ(on Mac)

Eclipse SceneBuilderを追加する

JavaFX SceneBuilder ~EclipseとSceneBuilder連携~

Java Basic一覧

Java Basic Level 1 ~Hello Java~

Java Basic Level2 ~Arithmetic Calculate~

Java Basic Level3 ~About String class~

Java Basic Level 4~Boolean~

Java Basic Level 5~If Statement~

Java Basic Summary from Level1 to 5

Java Basic Level 6 ~Traning of If statement~

Java Basic Level8 ~How to use for statement~

Java Basic Level 8.5 ~Array~

Java Basic Level 9~Training of for statement~

Java Basic Level 10 ~While statement ~

Java Basic Swing~オブジェクト指向~

Java Basic Swing Level 2~オブジェクト指向2~

サンプル実装~コンソールゲーム~

Java Basic インターフェース・抽象クラスの作り方

Java Basic クラスとは~Step2_1~

Java Basic JUnit ~テストスイートの作り方~

Git関連

Java Git clone in Eclipse ~サンプルの取得~

Eclipse Gitリポジトリの取得 ~GitからソースをPullしよう~

IntelliJ IDEA Git~Gitリポジトリからクローン~

JavaFX関連ページ

Eclipse SceneBuilderを追加する

JavaFX SceneBuilder ~EclipseとSceneBuilder連携~

JavaFX SceneBuilder~ボタンにメソッドを割り当てるワンポイント~

Java プロコンゲーム ~見た目の作成(SceneBuilderの使用)~

ステップアップ関連ページ一覧

Java 初めてでも大丈夫~ステップアッププログラミングのススメ~

ステップアッププログラミング~Java FxでHelloWorld解説~

Java StepUpPrograming~JavaFX で四則計算~

Java StepUpPrograming~JavaFXで画面切り替えを作る1~

Java StepUpPrograming~JavaFXで画面切り替え2ボタン作成~

Java StepUpPrograming~JavaFXで画面切り替え3アクション~

Java StepUpPrograming~JavaFXで画面切り替え4Pane切り替え~

Java StepUpPrograming~JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

JavaFX + ND4J~数学への挑戦1:ND4Jのインストール~

JavaFX + ND4J~数学への挑戦2: 行列の計算~

Java + ND4J ~数学への挑戦3: ベクトル(配列)の作成方法~

オブジェクト指向関連ページ

[オブジェクト指向の概念1~OracleDocのチュートリアル1~](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)

オブジェクト指向の概念2~クラスとは~

Java デザインパターン 〜Abstract Factory パターン〜

Androidアプリ作成の予備知識として、オブジェクト指向、クラスの組み合わせ方の王道としてデザインパターンに関して記載していきます。
作成したコードはgitにアップしてあります。
ちなみにEclipseで実装しました。

Abstract Factoryパターン

決められた一部の処理をごっそりと入れ替えることができる、デザインパターンです。

具体的に。。。

親クラスで、一通りの処理を実装しておき、変更、もしくはいろんなパターンで実装したい時に、この方法が使えます。
例として、JavaFXでは、Applicationクラスのstart()メソッドをオーバーライドするという形で実装されています。これは初めてプログラムを作成する人向けに記載しました、とりあえずは写経して動かしてみるのがいちばんだと思いますのでコードと動かすための予備知識的なことを記載しました。

実装サンプル

設計

ハローワールドのプログラムを作成します。ただし、表示する文言は実行するクラスによって変更できるように実装します。

実装

親クラス

gitのソースMain

public abstract class Main {

    public void hello() {
        String value = getValue();
        System.out.println(value);
    }
    //// 抽象メソッド ////
    protected abstract String getValue();
}

上の抽象メソッドは処理の中身がありません。これはこの「抽象クラス」を継承する子クラスで実装します。

子クラス

gitのソースChildA

public class ChildA extends Main {
    public static void main(String[] args) {
        ChildA main = new ChildA();
        main.hello();
    }

    @Override
    public String getValue() {
        return "Hello World";
    }
}

実行結果

こんな感じで、実行できます。

文言の変更

ここで、思うのは「ハローワールドはもういいかな?」というところだと思います。
なので、変更しようと思いますが。。。
この実装はこのまま残しておきます。
しかし、変更はしたいので。。。どーするか?

子クラスをもう1つ

gitのソースChildB

public class ChildB extends Main {
    public static void main(String[] args) {
        ChildB main = new ChildB();
        main.hello();
    }

    public String getValue() {
        return "Let's Java!";
    }
}

実装する内容はほとんど変わりませんが、ちょっと違います。
実行結果は以下の通り

こんな感じです。

でわでわ。。。



関連ページ一覧

Eclipse セットアップ

Java Install Eclipse~開発ツールのインストール~

TensorFlow C++環境~EclipseにCDTをインストール~

Setup OpenGL with Java~JOGLを使う準備 for Eclipse~

Eclipse Meven 開発手順~プロジェクトの作成~

Java OpenCV 環境セットアップ(on Mac)

Eclipse SceneBuilderを追加する

JavaFX SceneBuilder ~EclipseとSceneBuilder連携~

Java Basic一覧

Java Basic Level 1 ~Hello Java~

Java Basic Level2 ~Arithmetic Calculate~

Java Basic Level3 ~About String class~

Java Basic Level 4~Boolean~

Java Basic Level 5~If Statement~

Java Basic Summary from Level1 to 5

Java Basic Level 6 ~Traning of If statement~

Java Basic Level8 ~How to use for statement~

Java Basic Level 8.5 ~Array~

Java Basic Level 9~Training of for statement~

Java Basic Level 10 ~While statement ~

Java Basic Swing~オブジェクト指向~

Java Basic Swing Level 2~オブジェクト指向2~

サンプル実装~コンソールゲーム~

Java Basic インターフェース・抽象クラスの作り方

Java Basic クラスとは~Step2_1~

Java Basic JUnit ~テストスイートの作り方~

Git関連

Java Git clone in Eclipse ~サンプルの取得~

Eclipse Gitリポジトリの取得 ~GitからソースをPullしよう~

IntelliJ IDEA Git~Gitリポジトリからクローン~

JavaFX関連ページ

Eclipse SceneBuilderを追加する

JavaFX SceneBuilder ~EclipseとSceneBuilder連携~

JavaFX SceneBuilder~ボタンにメソッドを割り当てるワンポイント~

Java プロコンゲーム ~見た目の作成(SceneBuilderの使用)~

ステップアップ関連ページ一覧

Java 初めてでも大丈夫~ステップアッププログラミングのススメ~

ステップアッププログラミング~Java FxでHelloWorld解説~

Java StepUpPrograming~JavaFX で四則計算~

Java StepUpPrograming~JavaFXで画面切り替えを作る1~

Java StepUpPrograming~JavaFXで画面切り替え2ボタン作成~

Java StepUpPrograming~JavaFXで画面切り替え3アクション~

Java StepUpPrograming~JavaFXで画面切り替え4Pane切り替え~

Java StepUpPrograming~JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

JavaFX + ND4J~数学への挑戦1:ND4Jのインストール~

JavaFX + ND4J~数学への挑戦2: 行列の計算~

Java + ND4J ~数学への挑戦3: ベクトル(配列)の作成方法~

オブジェクト指向関連ページ

[オブジェクト指向の概念1~OracleDocのチュートリアル1~](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)

オブジェクト指向の概念2~クラスとは~