処理の流れは同じだが、場合によって処理の中身を変更したい場合に使えるパターン。
基本的な処理の流れの定義
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 かのどちらかを登録するようにすれば、実行時に構成ごとに使う実装を切り替えられる。