デザインパターン入門

Factory Methodパターン

インスタンス生成をサブクラスにまかせる

どんな場合に使うのか

newによる実際のインスタンス生成を,インスタンス生成のためのメソッド呼び出しに代えることで,具体的なクラス名による束縛からスーパークラスを解放している。

クラス図

サンプルプログラム

// Factory.cs
using System;

namespace chap04 {
  namespace framework {
    public abstract class Factory {
      public Product create(String owner) {
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
      }
      protected abstract Product createProduct(String owner);
      protected abstract void registerProduct(Product product);
    }
  }
}

// IDCard.cs
using System;
using chap04.framework;

namespace chap04 {
  public class IDCard : Product {
    public String owner { get; private set; }
    public IDCard(String owner) {
      Console.WriteLine(owner + "のカードを作ります.");
      this.owner = owner;
    }
    public override void use() {
      Console.WriteLine(owner + "のカードを使います.");
    }
  }
}

// IDCardFactory.cs
using System;
using System.Collections.Generic;
using chap04.framework;

namespace chap04 {
  public class IDCardFactory : Factory {
    public List<String> owners { get; private set; }
    public IDCardFactory() {
      owners = new List<String>();
    }
    protected override Product createProduct(string owner) {
      return new IDCard(owner);
    }
    protected override void registerProduct(Product product) {
      owners.Add(((IDCard)product).owner);
    }
  }
}

// Product.cs
namespace chap04 {
  namespace framework {
    public abstract class Product {
      public abstract void use();
    }
  }
}

// Program.cs
using chap04.framework;

namespace chap04 {
  class Program {
    static void Main(string[] args) {
      Factory factory = new IDCardFactory();
      Product card1 = factory.create("とむら");
      Product card2 = factory.create("佐藤花子");
      Product card3 = factory.create("小沢一郎");

      card1.use();
      card2.use();
      card3.use();
      System.Console.Read();
    }
  }
}
デザインパターン入門

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます