設計パターン学習(二)—作成型モード

5302 ワード

設計パターン学習(二)—作成型モード
作成型設計モードは、主にオブジェクトのインスタンスを構築するために使用され、オブジェクトのインスタンスの作成中のいくつかの経験的な要約である。
個人ホームページ:tuzhenyu’s page原文住所:設計パターン学習(二)—作成型
(0)基本概念
  • 作成型モードは、クラスのオブジェクトインスタンスの作成の詳細を隠しています。何を作成しますか?誰が作成しますか?いつ作成しますか?
  • 作成型のモードは主に単一の例のモード、工場のモードとビルダーのモードなどを含みます。
  • (1)ワンケースモード
  • シングル・モードは、グローバルにおいて一つのオブジェクト・インスタンスのみを作成し、外部に単一のインスタンス取得を提供するインターフェースである。
  • シングルケースのメリット:
  • は、廃棄対象を複数回作成することによる性能上の損失を避ける。
  • マルチスレッドは、同じ例を用いてスレッド間のリソース共有を実現する。
  • シングルモードの使用シーン
  • Spring容器におけるBeanのインスタンスはデフォルトでは一例であり、Aplication Contact容器は起動時にBeanを作成する単一のオブジェクトは一つのハッシュ・テーブル・キャッシュに保存される。
  • 
    id="date" class="java.util.Date"/>
    
    id="date" class="java.util.Date scope="singleton""/>
    
    id="date" class="java.util.Date" scope="prototype"/>
    
    id="date" class="java.util.Date default-lazy-init="true"/>
    
  • Java単一の例のモードとSpring中のBeaビンの単一の例のモード
  • Spring中のBeanのシングルケースモードとデザインモードの中のシングルケースのモードはまたすべて違っています。Spring中のBeanのシングルケースのライフサイクルとAppliation Contact容器は関連しています。一つのプロセスに複数のApple Contact容器があれば、Beanがシングルケースであっても複数のインスタンスが作成されます。
  • Java単一の例のモードは、一般にプロセス内に一例のオブジェクトのみが存在することを意味する。
  • 単例モードのスレッド安全問題
  • 単一のインスタンスクラスが状態である場合、クラス変数が存在するとスレッドセキュリティ問題が発生します(スレッドセキュリティ問題はクラス変数とグローバル変数によって引き起こされます)。スレッドの安全を解決するには、一般的に2つの方法があります。
  • SpringのBeanデフォルトは一例で、ThreadLocalを通じてスレッドの安全問題を解決します。SpringはいくつかのBean(例えば、Request Contactext Holder、Transaction Synch ronizationManager、Locaree Contact Holderなど)の非スレッドセキュリティ状態に対して、ThreadLocalを用いて処理し、これらもスレッドの安全な状態となります。
  • は、例えばSpring MVCのcontroller層においてHttpServletRequestが一例であり、同時に訪問する時に使用されるのは、HttpServletRequestのインスタンスオブジェクトです。このようにして、HttpServletRequestオブジェクトのスレッドセキュリティが実現される。
  • (2)工場モード
  • 工場モデルは一般的に簡単な工場モード、工場方法モードと抽象的な工場モードに分けられています。
  • 簡易工場モード
  • は、自己変数の違いに従って、同じではないインスタンスを返します。単純な工場パターンは、他のクラスのインスタンスを作成するためのクラスを特定し、作成されたインスタンスは、一般的に共通の親クラスを持つ。
  • 簡単な工場モデルの役割は、工場の種類Factory、抽象的な製品(製品の親)Product、具体的な製品
  • です。
  • 簡易工場モードの応用シーン:
  • SpringのBenFactoryは簡易工場モードを適用して、一つの一意の標識が入ってきたことによってbeanオブジェクトを獲得し、beanオブジェクトが存在しない場合は作成し、すでに存在している場合はそのまま戻る。
  • Nettyサービス端末クライアントの起動時には、補助タイプのBootstrapやServer Bootstrapなどを起動する必要があり、補助クラスの初期化時にはチャネルタイプのNioSocketChanelやNioServer SocketChanelなどを設置し、起動時に工場モードと反射に合わせてチャネル工場のchanelFactoryを作成し、チャネル例を作成します。
  • 工場仕様モデル
  • 工場法モードは、オブジェクトを作成するためのインターフェースを定義し、サブクラス実装インターフェースは、具体的な実装のどのクラスを決定し、複数の工場クラスに対応する複数のオブジェクトのインスタンスを作成します。
  • 工場方法モデルの役割:抽象工場類、具体的な工場類、抽象製品、具体的な製品
  • 工場方法モデルの使用状況:
  • SpringのFactoryBenは工場法モードを適用し、ビーンインスタンスを作成する際に初期化されていない空オブジェクトインスタンスを作成し、工場クラスFactoryBenを作成して空オブジェクトインスタンスを中に入れ、FactoryBenを経由してsingletonFactoresハッシュテーブルに入れ、getObjectを通じて工場からインスタンスを取得する。
  • 工場パターンの違い
  • 単純工場モードと工場方法モードの違い:単純工場モードには一つの工場例が存在し、パラメータを通して工場から異なる対象例を返します。例えば、BenFactoryだけが存在します。工場法パターンには複数の工場例が存在し、各オブジェクトは複数のFactoryBean例が存在するような工場例に対応している。
  • 工場モデルと抽象工場モデルの違い:工場モデルは抽象的な製品類だけで、抽象的な工場モデルは多様な抽象的な製品類があります。工場モデルの次の工場例は抽象的な製品類の実例しか生成できません。抽象的な工場モデルの下で、一つの工場の実例は多種の抽象的な製品の実例を生成できます。
  • (3)ビルダーモード
  • ビルダーモードは、複雑なオブジェクトを構成するプロセスを分離し、自由な組み合わせで複雑なオブジェクトを構築することである。複雑なオブジェクトに対しては,Buiderモードを用いて多パラメータ構造関数の代わりにすることが,比較的良い実践法則である。
  • ビルダーモード使用シーン
  • Nettyのサービス端末クライアントの起動時には、サポートクラスBootstrapまたはServer Bootstrapなどを起動することによって、BootstrapまたはServerBootstrap類の初期化をBuiderモードで行う必要があります。
  • 
    Bootstrap b = new Bootstrap();
    b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY,true)
            .handler(new ChannelInitializer() {
                @Override
                protected void initChannel(SocketChannel socketChannel) throws Exception {
                    socketChannel.pipeline().addLast(new TimeClientHandler());
                }
            });
    
    ChannelFuture f = b.connect(host,port).sync();
    f.channel().closeFuture().sync();
    締め括りをつける
    作成モードは主にクラスオブジェクトのインスタンスを作成するために使用され、異なるシナリオでは単独で使用しても良いし、単一の例モード、工場モード、またはビルダーモードなどを組み合わせて使用しても良い。