Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9707

[C#の基礎] GoFデザインパターン/テンプレートパターン

$
0
0

処理の流れは同じだが、場合によって処理の中身を変更したい場合に使えるパターン。

基本的な処理の流れの定義

public abstract class AbstractFoo{
  public virtual void Process(){
     Initialize();
     ProcessMain();
     Terminate();
  }
  public abstract void Initialize();
  public abstract void ProcessMain();
  public abstract void Terminate();
}

抽象クラスにしているのはこのクラス単体でインスタンス生成できなくするため。

実際の処理の中身を書く

publicclassFooImplementationA:AbstractFoo{publicvoidInitialize(){// do something}publicvoidProcessMain(){// do something}publicvoidTerminate(){// do something}}publicclassFooImplementationB:AbstractFoo{publicvoidInitialize(){// do something another type}publicvoidProcessMain(){// do something another type}publicvoidTerminate(){// do something another type}}

利用

単純にインスタンス生成して使う場合

varfooA=newFooImplementationA();fooA.Process();varfooB=newFooImplementationB();fooB.Process();

ファクトリー使うならこう

classFooFactory{publicFooGetFoo(stringtype){if(type=="A")returnnewFooImplementationA();if(type=="B")returnnewFooImplementationB();}}varfactory=newFooFactory();varfoo=factory.GetFoo("A");foo.Process();

DI使うならこう

varbuilder=newContainerBuilder();builder.RegisterType<FooImplementationA>().As<Foo>.InstancePerLifetimeScope();varcontainer=builder.Build();varfoo=container.Resolve<Foo>();foo.Process();

構成によって FooImplementationA か FooImplementationB かのどちらかを登録するようにすれば、実行時に構成ごとに使う実装を切り替えられる。


Viewing all articles
Browse latest Browse all 9707

Trending Articles