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クラス図