Java Basic Class 〜クラスを作ってクラスを理解する〜

久しぶりに、Javaの基本をやろうと思います。
Javaの基本といってもいろいろあるので、クラスの作り方をメインにやろうと思います。

早速作りましょう

とりあえずは、動かすのにメインメソッドが必要ですので、このメインメソッドを作成します。

作り方は、今までにやってきたので割愛します。

ここでのポイントは、MainメソッドのあるMainクラスを作成すると言うところです。

my.sample.Main

public class Main {
    public static void main(String[] args) {
        // 中身はまだない。。。
    }
}

このクラスから処理が始まります。

何をするか考える

設計の工程になります。。。

Step1

しかし、初めての人にもわかるよう、ハローワールドを実装します。

public class Main {
    public static void main(String[] args) {
        //  ハローワールド
        System.out.println("Hello World!");
    }
}
Step⒉

しかしこれでは、物足りない。。。
プログラム引数に、値を渡して、プログラム引数に値がある場合に表示すると言うものにしましょう

public class Main {
    public static void main(String[] args) {
        //  プログラム引数に値があるときは表示する
        if (args.length != 0) {
            System.out.println("プログラム引数:" + args[0]);
        }
        System.out.println("Hello World!");
    }
}
Step3

いやいや。。。プログラム引数が1つだけとは限らないので、そいつをどうにかしよう。

つまり、プログラム引数の数だけ表示しよう!

public class Main {
    public static void main(String[] args) {
        //  プログラム引数に値があるときは表示する
        if (args.length != 0) {
            for (int i = 0; i < args.length; i++) {
                System.out.println("プログラム引数[" + i + "]: " + args[0]);
            }
        }
        System.out.println("Hello World!");
    }
}
Step4

次は、文字表示だけじゃ面白くないから計算をしよう。

public class Main {
    public static void main(String[] args) {
        //  プログラム引数に値があるときは表示する
        if (args.length != 0) {
            for (int i = 0; i < args.length; i++) {
                System.out.println("プログラム引数[" + i + "]: " + args[0]);
            }
        }
        System.out.println("1 + 1 = " + (1 + 1));
    }
}

Step5

ここまできたら、クラスも作ってみよう。
しかし、今まで作成したコードは、書き換えてきたから、また呼び出したい時には、どうしたら良いだろうか?

クラスを使う

クラスを使うと、呼び出すメソッドを変えてやるだけで今までの作成したコードを実行できます。

Step1〜4までに作成したコードはどこかにいってしまいましたが、今後作成するプログラムは残せるように、クラスを作りながら進みます。

Step6: クラスを作る

とりあえず、今メインメソッドにある処理は邪魔なので、作成したクラスへ移動してしまいます。
新たに作成したクラスはFirstClsです、パッケージが違うのでインポートする必要があります。

そして、Mainクラスはこのようになりました。

public class Main {
    public static void main(String[] args) {
        FirstCls first = new FirstCls();
        first.printSomething(args);
    }
}

FirstCls

public class FirstCls {
    public void printSomething(String[] args) {
        //  プログラム引数に値があるときは表示する
        if (args.length != 0) {
            for (int i = 0; i < args.length; i++) {
                System.out.println("プログラム引数[" + i + "]: " + args[0]);
            }
        }
        System.out.println("1 + 1 = " + (1 + 1));
    }
}

処理の結果は変わりません。

そして、Eclipseでのパッケージ構成は下のようになっています。

ここからです。

Step7: クラスを使うメリット

現状、作成したプログラムは、
なんとなく作成した、意味のない処理が動いている状態です。

これは、とりあえずFirstClsによけておき、入力を受け取るプログラムを追加したいともいます。
これは、全ての処理の始まりになりますので、Mainクラスに実装します。実際に動かした時の動画です。

Step8: 標準入力を受ける

今までに処理結果をコンソールに表示していました。
ここは、「標準出力」と言う場所で、System.outで表現される(メモリ)領域です。

とりあえずここに表示するSystem.out.printメソッドで今まで表示を行なっていました。

次は、逆に入力、出力に対して入力を受け付けるプログラムを書きます。
Mianクラスに実装します。

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String input = scan.next();

        FirstCls first = new FirstCls();
        first.printSomething(args);
    }
}

そして、取得した標準入力をコントロールするためのメソッドをFirstClsに作成します。

public class FirstCls {

    public void handleInput(String input) {
        System.out.println("入力値: " + input);
    }

    /** 使用しないので下のアノテーションをつける */
    @Deprecated
    public void printSomething(String[] args) {
        //  プログラム引数に値があるときは表示する
        if (args.length != 0) {
            for (int i = 0; i < args.length; i++) {
                System.out.println("プログラム引数[" + i + "]: " + args[i]);
            }
        }
        System.out.println("1 + 1 = " + (1 + 1));
    }
}
Step9: まずはハローワールド

入力値をコンソールに表示するプログラムを作成しました。

上のような出力ができます。

作成したhandleInput()をそのままにしておき、次は引数が数字かどうか判定するメソッドを作成します。

public boolean isNumberString(String str) {
    // [0-9]は正規表現と言います。
    boolean isNumber = str.matches("[0-9]");
    return isNumber;
}

そして、これを初めに作ったメソッドから呼び出すようにします。

public void handleInput(String input) {
    System.out.println("入力値: " + input);
    if (isNumberString(input)) {
        System.out.println(input + "は、数字です");
    } else {
        System.out.println(input + "は、数字ではありません");
    }
}

こんな感じの実行結果が見れます。

作成したコードはこちらから参照(ダウンロード)できます
Mainクラス
FirstClsクラス

まとめ

このように、主軸になる処理を中心にして、処理を繋げられるように、処理を分断(機能レベル、処理レベル色々ありますが。。。)。

そして、組み合わせて実行!と言うように、なるべく修正、追加する作業を減らせるように作るとクールなプログラムと言えるでしょう。

あー自分も美しいプログラムが書けるようになりたい!

でわでわ。。。

関連ページ

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜


Java OpenCV エラーの対処 〜CvException /matrix.cpp:465: 〜

Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: OpenCV(3.4.3) /opencv/modules/core/src/matrix.cpp:465: error: (-215:Assertion failed) 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows in function 'Mat'
]
at org.opencv.core.Mat.n_submat(Native Method)
at org.opencv.core.Mat.submat(Mat.java:854)
at zenryokuservice.opencv.fx.ImageSlicerMain.loadImg(ImageSlicerMain.java:78)
at zenryokuservice.opencv.fx.ImageSlicerMain.main(ImageSlicerMain.java:107)

このエラーメッセージに、遭遇したら単純に、読み込んだファイルのサイズと読み込もうとしているサイズの指定がうまくいっていません。指定するサイズが不適切な感じです。

自分の実装したコードは下の様なものです。

URL p = this.getClass().getResource("/" );
System.out.println("*** " + p.getPath());
Mat downloadFile = Imgcodecs.imread(p.getPath());


自分の場合は上のようなコードで、リソース(ファイル)が取得できていませんでした。それゆえにエラー。

下の部分はデバッグ用に実装した部分です。取得したパスの確認をしました。

System.out.println("*** " + p.getPath())

Class#getResource()とnew File(パス)で実装する時にルートになる場所が変わるので注意が必要です。

作成したImageSlicerでイメージファイルを切り刻みます。
ソースコードは、こちらに有ります

ポイントは、ループする最中に、xPosとyPosで切り出すファイルの位置をづらしていくところです。
そして、確認用のSwingは最後に出力するイメージが表示されます。。。

private ImageIcon dstImage(String fileName, Mat downloadFile, String sufix, int xPos, int yPos, int size, int times) {
    Rect roi = new Rect(xPos, yPos, size, size);
    System.out.println("x: " + roi.x);
    System.out.println("y: " + roi.y);
    Mat target = downloadFile.submat(roi);
    MatOfByte bytes = new MatOfByte();
    Imgcodecs.imencode(".png", target, bytes);
    byte[] b = bytes.toArray();
    InputStream in = new ByteArrayInputStream(b);
    BufferedImage buf = null;
    try {
        buf = ImageIO.read(in);
        File out = new File("resources/dst/" + fileName + "_" + sufix + ".png");
        ImageIO.write(buf, "png", out);
    } catch(IOException e) {
        e.printStackTrace();
    }
    return new ImageIcon(buf);
}


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~クラスとは~

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

今回は、Androidアプリ作成のヒントとしてデザインパターンに関して記載します。

大まかに、Androidアプリのフレームワーク(アーキテクチャ)として下のような図が描けます。(Androidのサイト参照)

そして、このフレームワーウを理解するために「デザインパターン」の理解がいちばんの近道だと思うので記載します。MVCモデル(参考)の理解にも近いです。

基本はオブジェクト指向

オブジェクト指向と一言で言いますが、「ポリモーフィズム」のことです。「?」が頭に浮かんだ方は気にしなくて結構です。重要ではありません。イメージがつきやすいであろうと思い記載しました。

ポイント

オブジェクト指向の考え方に従い、色々考えていくと「デザインパターン」にたどり着きます。
早い話が、「こう設計すると、綺麗なデザインになります」というものです。

Factory Methodパターン

今回は、このパターンから入ります。
Factoet Methodパターンの理解から入りたいと思います。

親クラスをカスタムするパターン

このFactory Methodパターンは、すでに出来上がっている親子関係を使って新しい機能を実装する時に便利なパターンです。

具体的に

実装するクラスで「First Program is ...」という文言を出力するところを変更して、好きな文言を出力するプログラムを作ろうとした時、以下のような形で実装できます。
<親クラス>

class Parent {
  public Parent() {
  }

  public void sayHello() {
     System.out.println("First Program is ...);
  }

  public static void main(String[] args) {
      sayHello();
  }

<子クラス>

class Child {
  public Child() {
  }

  @Override
  public void sayHello() {
      System.out.println("Hello World!");
  }
}

これで、親クラスのメインメソッドを実行した時には「First Program is ..」と表示されますが、子クラスからメインメソッドを実行すると「Hello World」と表示されます。

ちょっと簡単でしたが、こんな感じです。

Androidアプリを作成する時には、一度作成したクラスの一部を変更したい時に使える方法と言えます。

Springframeworkでもこのデザインパターを使用しているようです。

BeanFactoryというクラスがそれのようです。

このクラスは、XMLでロードしたクラスを取得するときに使用するクラスだったと思います。

詳細に関しては、こちらのリンクを参照ください。

上のリンクは、SpringframeworkのJavaDocへのリンクになります。

java apiで使用しているもの

これらは、上記のフレームワークに必要なオブジェクトのインスタンスを生成するようなファクトリクラスのようです。

でわでわ。。。