Factory Methodパターン

Factory Method

生成に関するデザインパターン
使用頻度は少ないっぽい。
直訳すると工場のメソッドだが、何の工場なのか?
インスタンスの工場
Factory MethodはVirtual Constructorとも呼ばれコンストラクタの代わりとなるメソッド。
このメソッドはスーパークラスで定義して、サブクラスで実際にオブジェクトを作成する。

運送会社を例に考える

トラックで運送を行っている会社は、
トラックを車庫から出して(インスタンスの生成)
そのトラックを使用して荷物を届けている。

public class Logistics
{
  public void Delivery()
  {
    var truck = new Truck();
    truck.Deliver();
  }
}

public class Truck
{
  public void Deliver() => System.Console.WriteLine("トラックで運ぶよ");
}

離島への運送依頼

報酬が良かったため、特別に離島への運送を行うことにした。

public class Logistics
{
  public void Delivery()
  {
    //var truck = new Truck();
    var truck = new Ship();
    truck.Deliver();
  }
}

public class Ship
{
  public void Deliver() => System.Console.WriteLine("船で運ぶよ");
}

継続と問題

海路の運送が意外に利益が大きいため、今後も続けることにした。
それ以外の問題として、これまでトラックを使ってしていたDelivery()でエラーが発生した。
⇒Factory Methodを適用。

スーパークラスの定義

どちらも運送なので、Logisticsクラスを作成

public abstract class Logistics
{
  public void Delivery()
  {
    var transport = CreateTransport();
    transport.Deliver();
  }

  public abstract ITransport CreateTransport();
}

public interface ITransport
{
  public void Deliver();
}
サブクラス陸路
public class LandLogistics : Logistics
{
  public override ITransport CreateTransport() => new Truck();
}
 
public class Truck : ITransport
{
  public void Deliver() => System.Console.WriteLine("トラックで搬送");
}
サブクラス海路
public class SeaLogistics : Logistics
{
  public override ITransport CreateTransport() => new Ship();
}
 
public class Ship : ITransport
{
  public void Deliver() => System.Console.WriteLine("船で搬送");
}

UMLクラス図