コンストラクションモードの紹介


複数の設計モードは、通常のコンストラクタでは解決できない問題を解決することができる.
1.一般的な構造の課題:
  ブレークスルー1:Javaコンストラクタの使用と動作に関する4つのルールをリストしてください.
  答え:(1)開発者がクラスにコンストラクタを提供していない場合、Javaはそのクラスにデフォルトのコンストラクタを提供する.
       (2)コンストラクタの名前はクラス名と同じでなければならない.したがって、コンストラクタ名は通常、他の方法の名前とは異なり、大文字で始まる.この点は少し変に見える.
       (3)コンストラクタはthis()メソッドとsuper()メソッドを使用して他のコンストラクタを呼び出すことができますが、this()メソッドとsuper()メソッドの呼び出しは、コンストラクタの最初の文でなければなりません.
       (4)コンストラクタの実行結果はクラスのインスタンスを得るが,従来のメソッドの戻りタイプは制限されない.
       (5)newまたは反射を用いてコンストラクタを呼び出す.
 
  Javaコンストラクタは、コンストラクタが明示的に宣言されていない場合にデフォルトのコンストラクタを提供するほか、2番目のデフォルトで提供される内容は、コンストラクタ宣言がthis()またはsuper()を使用して他のコンストラクタを明示的に呼び出さない場合、Javaがパラメータを持たないsuper()を自動的に追加することです.次のコードがコンパイルエラーを引き起こすなど、予想外の結果をもたらす可能性があります.
package app.construction;
public class Fuse
{
	private String name;
	public Fuse(String name) { this.name = name;}
}

 次のコードがあります.
 
 
package app.construction;
public class QuickFuse extends Fuse
{
}

 コンパイラはエラーを報告します.エラーは次のようなものです.
QuickFuse.java:2:シンボルが見つかりません:コンストラクション関数Fuse()の場所:クラスapp.construction.Fusepublic class QuickFuse extends Fuse       ^1エラー
 
    コンパイラがQuickFuseクラスに遭遇するとエラーが表示され、デフォルトのコンストラクタが提供されます.デフォルトのコンストラクタにはパラメータがなく、パラメータなしでスーパークラスのコンストラクタが呼び出されます.しかし、Stringオブジェクトパラメータを受信するFuse()コンストラクタは、コンパイラがFuseクラスにデフォルトのコンストラクタを提供しないことを意味します.QuickFuseのデフォルトコンストラクタでは、このコンストラクタは存在しないため、パラメータのないスーパークラスコンストラクタを呼び出すことはできません.
 
    オブジェクトをインスタンス化する最も一般的な方法はnewオペレータを呼び出すことですが、反射(reflection)も使用できます.[反射](Reflection)では、タイプとタイプのメンバーをオブジェクトとして使用できます.反射を頻繁に使用しなくても、既存のプログラムに従って反射を使用することができます.次に例を示します.
package app.construction;
import java.awt.Point;
import java.lang.reflect.Constructor;
public class ShowReflection
{
     public static void main(String[] args)
     {
          Constructor[] cc = Point.class.getConstructors();
          Constructor cons = null;
          for(int i=0;i<cc.length;i++)
               if(cc[i].getParameterTypes().length == 2)
                   cons = cc[i];
          try
          {
               Object obj = cons.newInstance(new Object[] {new Integer(3),new Integer(4)});
          }catch(Exception e)
          {
               System.out.println("Exception : " + e.getMessage());
          }
     }
}

出力結果は次のとおりです.
java.awt.Point[x=3,y=4]
 
2つのパラメータを持つコンストラクタを発見し,提供されたパラメータを用いて新しい点を作成することに成功した.
 
2.まとめ: 
   通常、クラスのインスタンス化のために、独自に開発したクラスにコンストラクタを提供する必要があります.クラスのコンストラクタ間で相互に呼び出され、相互に協力して初期化作業が完了する可能性があります.クラスの各コンストラクタは、最終的にスーパークラスのコンストラクタを呼び出します.一般的にはnewオペレータを使用してコンストラクタを呼び出すことができますが、反射を使用してオブジェクトをインスタンス化および使用することもできます.
 
3.過負荷通常構造:
  新しいクラスを設計するとき、Javaコンストラクタが提供する様々な特徴は、多くの選択肢を提供します.しかし、コンストラクタを使用してクラスのインスタンス化を行うには、どのクラスをインスタンス化する必要があるか、インスタンス化するときにどのパラメータを提供する必要があるかを事前に知る必要があります.たとえば、グラフィックユーザインタフェースコンポーネントを選択する場合、アプリケーションがハンドヘルドデバイス上で実行されるか、大規模なディスプレイデバイス上で実行されるかを考慮する必要があります.また、開発者は、どのクラスをインスタンス化するかを知っている場合がありますが、どの初期パラメータを提供する必要があるか、どのパラメータが必要か分からない場合がありますが、どのようなフォーマットを使用するべきか分かりません.たとえば、開発者は、オブジェクトのスリープバージョンまたはテキストバージョンに基づいてオブジェクトを構築する必要がある場合があります.これらの場合、通常のJavaコンストラクタでは問題を解決できないため、設計モードを使用する必要があります.
 
  以下に、各構成モードの設計目的をそれぞれ説明する.
 
         君が望むなら                              適用可能モード
オブジェクトを構築する前に、オブジェクトの構築に関する情報を徐々に収集します.
Builderモード
インスタンス化が必要なクラスの決定を遅らせる
Factory Methodモード
共通のプロパティを持つ一連のオブジェクトを構築する
Abstraact Factoryモード
与えられた例に基づいてオブジェクトを作成
Prototypeモード
オブジェクトの内部状態のみを含むスリープバージョンに基づいてオブジェクトを再構築
Mementoモード
 
   それぞれのデザインパターンには、独自の応用場面があります.構築向けの設計モードにより、クラスのコンストラクタを呼び出さずに新しいオブジェクトを構築できるようになります.たとえば、オブジェクトを構築するために必要な初期パラメータ値を徐々に取得する必要がある場合、ジェネレータモードを適用できます.