Javaでオブジェクトを作成するときに最もよく使われる方法は、
コンストラクタを呼ぶことです。
コンストラクタ以外にもインスタンス情報を送信する他の方法があります。
サンプルコードを作成してみました。
パッケージの構成こうです。
まず、TVです
package homework;
public class Tv {
String screen;
String audio;
int button;
public static Tv newInstance(String type){
if (type.equals("SmartTv")) {
return new SmartTv();
} else if (type.equals( "NormalTv" )) {
return new NormalTv();
}
return null;
}
public void testTv() {
System.out.println(screen + "Screen, " + audio + "Audio, " + button + "Button");
}
public String getScreen() {
return screen;
}
public String getAudio() {
return audio;
}
public int getButton() {
return button;
}
}
次はTVを継承するSmartTVです。
package homework;
public class SmartTv extends Tv {
String screen = "High";
String audio = "A rank ";
int button = 2;
public String getScreen() {
return screen;
}
public String getAudio() {
return audio;
}
public int getButton() {
return button;
}
}
TVを継承するNormalTVです。
package homework;
public class NormalTv extends Tv {
String screen = "Low";
String audio = "B rank ";
int button = 1;
public String getScreen() {
return screen;
}
public String getAudio() {
return audio;
}
public int getButton() {
return button;
}
}
テストコードです。
package homework;
public class homework01 {
public static void main(String[] args) {
Tv tv1 = Tv.newInstance("SmartTv");
System.out.println("SmartTV: " + tv1.getScreen()+"screen, " +
tv1.getAudio()+"Audio, " + tv1.getButton()+"つのボタン");
Tv tv2 = Tv.newInstance("NormalTv");
System.out.println("NormalTV: " + tv2.getScreen()+"screen, " +
tv2.getAudio()+", " + tv2.getButton()+"つのボタン");
}
}
結果です。
ScreenTV: HighScreen, A rank Audio, 2つのボタン
TVクラスを見ると、コンストラクタがありません。
newInstance メソッドでstaticファクトリメソッドが使われています。
テストクラスでTv.newInstanceのコードが
そのstaticファクトリメソッドを利用しているコードです。
このようにstaticファクトリメソッドはインスタンスを作り、
リターンする一種の工場のような役割をしています。
このように、コンストラクタを通じたインスタンスリターンじゃなく
staticファクトリメソッドを通じてインスタンスを返すと、
まず、最初の利点は、メソッドに名前を付けることができることです。
ご存知のように、コンストラクタはクラス名が入るだけで命名することはできません。
上では、新しいインスタンスをリターンするという意味でnewInstanceに付けました。
複雑なクラスでどのコンストラクタがどのような役割をするのかよくわからない場合は
staticファクトリメソッドに置き換えたら、ネーミングにより、このクラスを利用する人の理解を手伝います。
第二の利点は、オブジェクトを生成しない方法も使うことができます。
つまり新しいインスタンスを作り上げ返すことじゃなく、別のオブジェクトをリターンすることができる。
第三の利点は、subタイプのオブジェクトも渡すことができるという点である。
上記のコードを見ると、TVを継承するNormalTvとSmartTVがあります。
これらのインスタンスをTVというクラスで伝達していることが確認できます。
TVのサブ型オブジェクトをTVというクラスから直接伝達しました。
これらのような柔軟さがStaticファクトリメソッドの最大の利点になっています。
댓글 없음:
댓글 쓰기