スポンサーサイト

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

F#によるデザインパターン入門 ファクトリー パターン(2)

今回は前回のコードに少し変更を加えてみます。変更点は次の2点です。
(1)Product側で継承ではなく、インターフェイスを利用する
(2)Creatorは継承関係を使わず、生成するクラスの違いをコンストラクタに渡す関数の違いで実現する
 
まずProduct側を定義します。
 
> type MyProduct  =
    abstract member method1 : unit -> unit
    abstract member method2 : unit -> unit
 
type MyConcreteProduct1 () =
    interface MyProduct with 
       override  this.method1 () =
          printfn "MyConcreteProduct1クラスのインスタンスとしてのmethod1の実行"
       override this.method2 () =  
          printfn "MyConcreteProduct1クラスのインスタンスとしてのmethod2の実行"
 
 
type MyConcreteProduct2 () =
    interface MyProduct with 
       override  this.method1 () =
          printfn "MyConcreteProduct2クラスのインスタンスとしてのmethod1の実行"
       override this.method2 () =  
          printfn "MyConcreteProduct2クラスのインスタンスとしてのmethod2の実行"
 
///////////////////////////////////////////////////////////////////////////////////////
;;
 
type MyProduct =
  interface
    abstract member method1 : unit -> unit
    abstract member method2 : unit -> unit
  end
type MyConcreteProduct1 =
  class
    interface MyProduct
    new : unit -> MyConcreteProduct1
  end
type MyConcreteProduct2 =
  class
    interface MyProduct
    new : unit -> MyConcreteProduct2
  end
 
 
次にCreator側ですが、これはコンストラクタに unit -> MyProduct型の関数を渡してこれを用いてMyProduct型のインスタンスを生成して使うようにします。
 
> type MyCreator (g : unit -> MyProduct) =
    member this.manupilate () =
        let t = g ()
        t.method1 ()
        t.method2 ()
        t.method1 ();;
 
type MyCreator =
  class
    new : g:(unit -> MyProduct) -> MyCreator
    member manupilate : unit -> unit
  end
  
では使用してみます。
まずMyConcreteProduct1型のインスタンスを生成して使うMyCreator型のインスタンスを生成します。
 
> let myC1 = new MyCreator(fun () -> (new MyConcreteProduct1()) :> MyProduct);;
val myC1 : MyCreator
 
同様にMyConcreteProduct2型のインスタンスを生成して使うMyCreator型のインスタンスを生成します。
 
> let myC2 = new MyCreator(fun () -> (new MyConcreteProduct2()) :> MyProduct);;
val myC2 : MyCreator
 
それぞれのmanupilateメソッドを呼び出します。
 
> myC1.manupilate();;
MyConcreteProduct1クラスのインスタンスとしてのmethod1の実行
MyConcreteProduct1クラスのインスタンスとしてのmethod2の実行
MyConcreteProduct1クラスのインスタンスとしてのmethod1の実行
val it : unit = ()
 
> myC2.manupilate();;
MyConcreteProduct2クラスのインスタンスとしてのmethod1の実行
MyConcreteProduct2クラスのインスタンスとしてのmethod2の実行
MyConcreteProduct2クラスのインスタンスとしてのmethod1の実行
val it : unit = ()
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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