スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#によるデザインパターン入門 AbstractFactoryパターン(2)

今回は前回の例をF#のレコード型を使って書いてみたいと思います。
 
まずは前回定義したfactory部分以外のところを再掲しておきます。
 
type MyTypeA  =
    abstract member methodA : unit -> unit
 
type MyTypeB  =
    abstract member methodB : int -> unit
 
[<AbstractClass>]
type MyTypeC (init_j)  =
     abstract member methodC : unit -> unit
     member this.J = init_j
 
type MyTypeACntxtα () =
    interface MyTypeA with
        member this.methodA () =
            printfn "文脈αで用いられるobjectがmethodAを実行します。"
 
type MyTypeBCntxtα () =
    interface MyTypeB with
        member this.methodB (i) =
            printfn "文脈αで用いられるobjectが引数%dに対しmethodBを実行します。" i
 
type MyTypeCCntxtα (init_j) =
    inherit MyTypeC (init_j) with
       override  this.methodC () =
            printfn "文脈αで用いられるobjectがプロパティ%dに対しmethodCを実行します。" init_j
 
 
type MyTypeACntxtβ () =
    interface MyTypeA with
        member this.methodA () =
            printfn "文脈βで用いられるobjectがmethodAを実行します。"
 
type MyTypeBCntxtβ () =
    interface MyTypeB with
        member this.methodB (i) =
            printfn "文脈βで用いられるobjectが引数%dに対しmethodBを実行します。" i
 
type MyTypeCCntxtβ (init_j) =
    inherit MyTypeC(init_j) with
        override this.methodC () =
            printfn "文脈βで用いられるobjectがプロパティ%dに対しmethodCを実行します。" init_j
 
それではオブジェクト生成の関数の組をフィールドとするレコードを定義します。
 
> type MyFac =  //レコード型の定義
    { des : string ;         //説明用のフィールド
      CrTA: unit -> MyTypeA ;//TypeAのインスタンスを生成して返す関数
      CrTB :unit -> MyTypeB ;//TypeBのインスタンスを生成して返す関数
      CrTC :int  -> MyTypeC //TypeCのインスタンスを生成して返す関数
     };;
 
type MyFac =
  {des: string;
   CrTA: unit -> MyTypeA;
   CrTB: unit -> MyTypeB;
   CrTC: int -> MyTypeC;}
   
文脈αで使われるオブジェトを生成する関数(コンストラクタ)をフィールドの要素とするレコードを一つ作ります。
 
> let  cntxtαFac =
        {des = "文脈αでのfactory";
         CrTA = (fun () ->(new MyTypeACntxtα()) :> MyTypeA) ; 
         CrTB = (fun () ->(new MyTypeBCntxtα()) :> MyTypeB) ; 
         CrTC = (fun  i ->(new MyTypeCCntxtα(i)) :> MyTypeC) } 
;;
 
同様に文脈βで使われるオブジェトを生成する関数(コンストラクタ)をフィールドの要素とするレコードを一つ作ります。
 
> let  cntxtβFac =
        {des = "文脈αでのfactory";
         CrTA = (fun () ->(new MyTypeACntxtβ()) :> MyTypeA) ; 
         CrTB = (fun () ->(new MyTypeBCntxtβ()) :> MyTypeB) ; 
         CrTC = (fun  i ->(new MyTypeCCntxtβ(i)) :> MyTypeC) } 
;;
 
MyFacのレコードを受け取ってインスタンスを生成しながら、なんらかの処理をする関数を次のように定義します。
 
> let doSomethingWithRecod (cf :MyFac) =
    printfn "%sを使います" cf.des
    printfn "何らかの処理1"
    cf.CrTA ().methodA() // ((cf.CrTA) () ).methodA () と同じ 
    printfn "何らかの処理2"
    cf.CrTB ().methodB(3) 
    printfn "何らかの処理3"
    let lst1 =  (cf.CrTC (5)) :: []    
    let lst2 =  (cf.CrTC (7)) :: lst1
    lst2 |>
        List.iter (fun x -> x.methodC());;
 
val doSomethingWithRecod : MyFac -> unit
 
レコードcntxtαFacを渡してみます。
 
> doSomethingWithRecod cntxtαFac;;
文脈αでのfactoryを使います
何らかの処理1
文脈αで用いられるobjectがmethodAを実行します。
何らかの処理2
文脈αで用いられるobjectが引数3に対しmethodBを実行します。
何らかの処理3
文脈αで用いられるobjectがプロパティ7に対しmethodCを実行します。
文脈αで用いられるobjectがプロパティ5に対しmethodCを実行します。
val it : unit = ()
 
レコードcntxtβFacを渡してみます。
 
> doSomethingWithRecod cntxtβFac;;
文脈αでのfactoryを使います
何らかの処理1
文脈βで用いられるobjectがmethodAを実行します。
何らかの処理2
文脈βで用いられるobjectが引数3に対しmethodBを実行します。
何らかの処理3
文脈βで用いられるobjectがプロパティ7に対しmethodCを実行します。
文脈βで用いられるobjectがプロパティ5に対しmethodCを実行します。
val it : unit = ()
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。