前回振り返り
Factory Method パターン
Factory Methodパターンとは、インスタンスの作り方をスーパークラスで定め、具体的な処理をサブクラスで行うパターンです。オブジェクトの生成と具体的な処理を分離することで、より柔軟にオブジェクトを利用することができます。
Factory Method パターンのクラス図は、CreatorとProductの2つの抽象クラスを持ちます。Creatorは、Productを生成するためのファクトリメソッドを持ちます。そして、ConcreteCreatorは、具体的なProductを生成するために、Creatorを継承してファクトリメソッドを実装します。ConcreteProductは、Productの具体的な実装を提供します。
前回演習問題の解答 例
問題1
問題文
Factory Method パターン を作成してみましょう。
wikipedia のJava実装例をC#で記述してみましょう。
解答例
// Creatorに相当する
using System;
using System.Collections;
abstract class ListPrinter
{
// anOperationに相当する
public void printList(List<String> list)
{
Comparer<String> comparator = createComparator();
list = new List<String>(list);
list.Sort(comparator);
foreach (String item in list)
{
Console.WriteLine(item);
}
}
// factoryMethodに相当する
protected abstract Comparer<String> createComparator();
}
// ConcreteCreatorに相当する
class DictionaryOrderListPrinter : ListPrinter
{
protected override Comparer<String> createComparator()
{
return new DictionaryOrderComparator();
}
}
class StateB : State
{
private int count = 0;
public void writeName(StateContext stateContext, String name)
{
Console.WriteLine(name.ToUpper());
// StateBのwriteName()が2度呼び出された後にコンテキストをStateAに遷移する
if (++count > 1)
{
stateContext.setState(new StateA());
}
}
}
public class StateContext
{
private State myState;
public StateContext()
{
setState(new StateA());
}
// 通常は、Stateインタフェースを実装しているクラスによってのみ呼び出される
public void setState(State newState)
{
this.myState = newState;
}
public void writeName(String name)
{
this.myState.writeName(this, name);
}
}
// ComparerがProductに相当する
// ConcreteProductに相当する
class DictionaryOrderComparator : Comparer<String>
{
public override int Compare(string? str1, string? str2)
{
return str1.CompareTo(str2);
}
}
// ConcreteCreatorに相当する
class LengthOrderListPrinter : ListPrinter
{
protected override Comparer<String> createComparator()
{
return new LengthOrderComparator();
}
}
// ConcreteProductに相当する
class LengthOrderComparator : Comparer<String>
{
public override int Compare(string? str1, string? str2)
{
return str1.Length - str2.Length;
}
}
// メインクラス
public class FactoryMethodSample
{
public static void Main(string[] args)
{
List<string> list = new List<string>(new[] { "いちご", "もも", "いちじく" });
Console.WriteLine("五十音順で表示:");
new DictionaryOrderListPrinter().printList(list);
Console.WriteLine();
Console.WriteLine("長さ順で表示:");
new LengthOrderListPrinter().printList(list);
}
}
問題2
問題文
問1のクラスを身近なものにアレンジしてみましょう。
解答例
abstract class Creator
{
public abstract Product FactoryMethod();
}
class ConcreteCreator : Creator
{
public override Product FactoryMethod()
{
return new ConcreteProduct();
}
}
abstract class Product
{
public abstract void Use();
}
class ConcreteProduct : Product
{
public override void Use()
{
Console.WriteLine("ConcreteProductを使います。");
}
}
class Program
{
static void Main(string[] args)
{
Creator creator = new ConcreteCreator();
Product product = creator.FactoryMethod();
product.Use();
}
}
今回の演習問題
問題1
問題文
Template Method パターン を作成してみましょう。
wikipedia のJava実装例をC#で記述してみましょう。
問題2
問題文
問1のクラスを身近なものにアレンジしてみましょう。
コメント