<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C#</title><link>http://blogs.wankuma.com/masaru/category/1287.aspx</link><description>C#</description><managingEditor>まさる</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>まさる</dc:creator><title>デザインパターンを学ぶ～その１9：Singletonパターン(2)～</title><link>http://blogs.wankuma.com/masaru/archive/2008/07/24/150168.aspx</link><pubDate>Thu, 24 Jul 2008 23:24:00 GMT</pubDate><guid>http://blogs.wankuma.com/masaru/archive/2008/07/24/150168.aspx</guid><wfw:comment>http://blogs.wankuma.com/masaru/comments/150168.aspx</wfw:comment><comments>http://blogs.wankuma.com/masaru/archive/2008/07/24/150168.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/masaru/comments/commentRss/150168.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/masaru/services/trackbacks/150168.aspx</trackback:ping><description>&lt;p&gt;さて、&lt;a href="http://blogs.wankuma.com/masaru/archive/2008/06/08/142217.aspx" target="_blank"&gt;前回&lt;/a&gt;は一番単純なSingletonの実装を紹介しました。そして、そのなかで、&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;以下のようにマルチスレッドで動かす場合、1つだけであるはずのインスタンスが、複数生成されてしまうことがあります。&lt;/p&gt; &lt;p&gt;～中略～&lt;/p&gt; &lt;p&gt;ごらんのように、インスタンスが２つ生成された結果、ログ出力パスが変わってしまいます。  &lt;p&gt;この問題を解消する方法はないのでしょうか？  &lt;p&gt;実はあります。&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;と書きました。 &lt;/p&gt; &lt;p&gt;まずは、なぜインスタンスが２つ作成されるかを考えてみましょう。そのために、前回のコードの、インスタンス取得部分のコードを再掲します。&lt;/p&gt; &lt;h5&gt;C#&lt;/h5&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9d968456-522a-43f0-9bf4-d71d5fb5ec8f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;  /// &amp;lt;summary&amp;gt;
  /// プロパティ インスタンス
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;remarks&amp;gt;自身の唯一のインスタンスを返す&amp;lt;/remarks&amp;gt;
  public static SingletonLogger Instance
  {
    get
    {
      if ( _uniqueLogger == null )
      {
        _uniqueLogger = new SingletonLogger();
      }
      return _uniqueLogger;
    }
  }

&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h5&gt;VB&lt;/h5&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0b4c1266-e26a-47ed-a628-6b60824b36f4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb"&gt;  ''' &amp;lt;summary&amp;gt;
  ''' プロパティ インスタンス
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;
  ''' &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
  ''' &amp;lt;remarks&amp;gt;自身の唯一のインスタンスを返す&amp;lt;/remarks&amp;gt;
  Public Shared ReadOnly Property Instance() As SingletonLogger
    Get
      If _uniqueLogger Is Nothing Then
        _uniqueLogger = New SingletonLogger
      End If
      Return _uniqueLogger
    End Get
  End Property
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;このコードで何が問題かというと、C#、VBともに9行目でインスタンスがないことを確認した後、10行目で新しいインスタンスを作成するのですが、コンストラクタが重い場合、インスタンスが生成される前に他のスレッドによって9行目が再び実行され、このときはやはりインスタンスがないので、そのまま後に実行されたスレッドでも10行目が実行されてしまうのです。&lt;/p&gt;
&lt;p&gt;これを解決する方法には大きく２つあるのですが、今回は有名な「二重チェック」の方法を紹介します。さっそくコードを見てみましょう。&lt;/p&gt;
&lt;h5&gt;C#&lt;/h5&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:87efaa22-f270-4ae3-8700-ddb70c886002" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;/// &amp;lt;summary&amp;gt;
/// ログ出力クラス
/// &amp;lt;/summary&amp;gt;
public class SingletonLogger
{
  /// &amp;lt;summary&amp;gt;
  /// ログ出力パス
  /// &amp;lt;/summary&amp;gt;
  private string _logPath;

  /// &amp;lt;summary&amp;gt;
  /// プロパティ ログ出力パス
  /// &amp;lt;/summary&amp;gt;
  public string LogPath
  {
    get
    {
      return _logPath;
    }
  }

  /// &amp;lt;summary&amp;gt;
  /// コンストラクタ
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;remarks&amp;gt;new でインスタンス化できないよう、privateでコンストラクタを定義&amp;lt;/remarks&amp;gt;
  private SingletonLogger()
  {
    // 重い初期化処理
    for ( var i = 0; i &amp;lt; 100000000; i++ )
    {
    }

    _logPath = DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".log";
  }

  /// &amp;lt;summary&amp;gt;
  /// 自身の唯一のインスタンス
  /// &amp;lt;/summary&amp;gt;
  private volatile static SingletonLogger _uniqueLogger;

  /// &amp;lt;summary&amp;gt;
  /// ロック用のオブジェクト
  /// &amp;lt;/summary&amp;gt;
  private static object lockObj = new object(); 

  /// &amp;lt;summary&amp;gt;
  /// プロパティ インスタンス
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;remarks&amp;gt;自身の唯一のインスタンスを返す&amp;lt;/remarks&amp;gt;
  public static SingletonLogger Instance
  {
    get
    {
      if ( _uniqueLogger == null )
      {
        lock ( lockObj )
        {
          if ( _uniqueLogger == null )
          {
            _uniqueLogger = new SingletonLogger();
          }
        }
      }
      return _uniqueLogger;
    }
  }

  /// &amp;lt;summary&amp;gt;
  /// ログ出力
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;param name="message"&amp;gt;&amp;lt;/param&amp;gt;
  public void WriteLog(string message)
  {
    // ログ出力処理
    // ・・・
  }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;h5&gt;VB&lt;/h5&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:59b2809b-2606-4fff-ba05-877de46b9ee4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb"&gt;''' &amp;lt;summary&amp;gt;
''' ログ出力クラス
''' &amp;lt;/summary&amp;gt;
''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;
Public Class SingletonLogger


  ''' &amp;lt;summary&amp;gt;
  ''' ログ出力パス
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;
  Private _logPath As String

  ''' &amp;lt;summary&amp;gt;
  ''' プロパティ ログ出力パス
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;
  ''' &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
  ''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;
  Public ReadOnly Property LogPath() As String
    Get
      Return _logPath
    End Get
  End Property

  ''' &amp;lt;summary&amp;gt;
  ''' コンストラクタ
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;remarks&amp;gt;new でインスタンス化できないよう、privateでコンストラクタを定義&amp;lt;/remarks&amp;gt;
  Private Sub New()
    ' 重い初期化処理
    For i As Integer = 0 To 100000000
    Next i

    _logPath = DateTime.Now.ToString("yyyyMMddhhmmssfff") &amp;amp; ".log"
  End Sub

  ''' &amp;lt;summary&amp;gt;
  ''' 自身の唯一のインスタンス
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;
  Private Shared _uniqueLogger As SingletonLogger

  Private Shared _lockObj As New Object()

  ''' &amp;lt;summary&amp;gt;
  ''' プロパティ インスタンス
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;
  ''' &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
  ''' &amp;lt;remarks&amp;gt;自身の唯一のインスタンスを返す&amp;lt;/remarks&amp;gt;
  Public Shared ReadOnly Property Instance() As SingletonLogger
    Get
      If _uniqueLogger Is Nothing Then
        SyncLock (_lockObj)
          If _uniqueLogger Is Nothing Then
            _uniqueLogger = New SingletonLogger
          End If
        End SyncLock
      End If
      Return _uniqueLogger
    End Get
  End Property

End Class
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;実行結果は次の通り。&lt;/p&gt;
&lt;h4&gt;実行結果&lt;/h4&gt;&lt;pre class="code" style="margin-top: 0.5em"&gt;20080724111338001.log
20080724111338001.log
&lt;/pre&gt;
&lt;p&gt;この方法のポイントは以下の通り。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ロック用オブジェクトを用意する。（C#の44行目、VBの44行目） 
&lt;li&gt;Instanceプロパティにアクセスされた際、インスタンスの有無を確認後、C#はlockステートメント、VBはSyncLockステートメントを使い、1.で用意したオブジェクトをロックする。（C#の56行目、VBの55行目）&lt;br&gt;これにより、後に実行されたスレッドは先に実行されたスレッドにてロックが解除されるまで待つこととなる。 
&lt;li&gt;ロックした後、もう一度インスタンスの有無を確認した後、インスタンスがなければ生成する。（C#の58～60行目、VBの56行目から57行目）&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;なお、C#のコードの39行目にて、_uniqueLoggerフィールドを宣言する際、「volatile」というキーワードをつけています。これは、このキーワードを付けられたフィールドは、キャッシュメモリ内に領域を確保しなくなるため、RAMとキャッシュで値が食い違うという現象が発生しなくなります。&lt;/p&gt;
&lt;p&gt;が、CLRのメモリ管理ではこの問題を解決しているため、「volatile」は無くても問題ありません。（Monoなど他のプラットフォームでは必要です、たぶん。）&lt;/p&gt;
&lt;p&gt;＃この辺りのことは、「プログラミング .NET Framework 第2版」のp.693、「24.3.8 ロックのための有名な二重チェックテクニック」に詳しく書かれています。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ところで、上記書籍の該当箇所にこんなことも書いてあります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;このテクニックが有名なのは、特に面白かったり便利だったりするからではありません。これが有名な理由は、これについて書かれた文献が多いからです。このテクニックはJavaで非常によく使われています。そして、Javaではこれがどこででも動作するわけではないことが後に明らかになりました。この問題を説明している有名な文書が次のWebページにあります。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html"&gt;http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;この問題って今はどうなってるんでしょうか？教えて！Javaのエロい人！&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;＃次回はもうひとつの方法について紹介します。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/masaru/aggbug/150168.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まさる</dc:creator><title>お許し下さい。決して魂を売ったわけじゃないんです・・・</title><link>http://blogs.wankuma.com/masaru/archive/2008/07/11/148539.aspx</link><pubDate>Fri, 11 Jul 2008 15:06:00 GMT</pubDate><guid>http://blogs.wankuma.com/masaru/archive/2008/07/11/148539.aspx</guid><wfw:comment>http://blogs.wankuma.com/masaru/comments/148539.aspx</wfw:comment><comments>http://blogs.wankuma.com/masaru/archive/2008/07/11/148539.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/masaru/comments/commentRss/148539.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/masaru/services/trackbacks/148539.aspx</trackback:ping><description>&lt;p&gt;しばらくVBをやっててC#に戻ったら、セミコロンの打ち忘れが多発しました・・・&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/masaru/aggbug/148539.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まさる</dc:creator><title>デザインパターンを学ぶ～その１8：Singletonパターン(1)～</title><link>http://blogs.wankuma.com/masaru/archive/2008/06/08/142217.aspx</link><pubDate>Sun, 08 Jun 2008 01:24:00 GMT</pubDate><guid>http://blogs.wankuma.com/masaru/archive/2008/06/08/142217.aspx</guid><wfw:comment>http://blogs.wankuma.com/masaru/comments/142217.aspx</wfw:comment><comments>http://blogs.wankuma.com/masaru/archive/2008/06/08/142217.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/masaru/comments/commentRss/142217.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/masaru/services/trackbacks/142217.aspx</trackback:ping><description>&lt;blockquote&gt;&lt;strong&gt;Singleton　（シングルトン）&lt;/strong&gt;&lt;br&gt;　一人っ子、単一のこと・もの &lt;/blockquote&gt; &lt;p&gt;Singletonパターンは、インスタンスがひとつしかない唯一のオブジェクトを生成し、そのインスタンスを取得する方法を公開します。  &lt;p&gt;例えば、アプリケーション実行時のログを出力するような場合を考えます。ログのファイル名をシステム日付＋時刻でつけるとしましょう。ログ出力を初回に行う際に、ログファイル名を決定し、以後はそのログファイルにログを出力します。  &lt;p&gt;この場合、ログファイル名はアプリケーション実行時に1つだけでなくてはなりません。このような場合、Singletonが使えます。  &lt;p&gt;&amp;nbsp; &lt;p&gt;以下に、コード例を示します。  &lt;h5&gt;C#&lt;/h5&gt;&lt;pre class="c#" name="code"&gt;/// &amp;lt;summary&amp;gt;
/// ログ出力クラス
/// &amp;lt;/summary&amp;gt;
public class SingletonLogger
{
  /// &amp;lt;summary&amp;gt;
  /// ログ出力パス
  /// &amp;lt;/summary&amp;gt;
  private string _logPath;

  /// &amp;lt;summary&amp;gt;
  /// プロパティ ログ出力パス
  /// &amp;lt;/summary&amp;gt;
  public string LogPath
  {
    get
    {
      return _logPath;
    }
  }

  /// &amp;lt;summary&amp;gt;
  /// コンストラクタ
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;remarks&amp;gt;new でインスタンス化できないよう、privateでコンストラクタを定義&amp;lt;/remarks&amp;gt;
  private SingletonLogger()
  {
    _logPath = DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".log";
  }

  /// &amp;lt;summary&amp;gt;
  /// 自身の唯一のインスタンス
  /// &amp;lt;/summary&amp;gt;
  private static SingletonLogger _uniqueLogger;

  /// &amp;lt;summary&amp;gt;
  /// プロパティ インスタンス
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;remarks&amp;gt;自身の唯一のインスタンスを返す&amp;lt;/remarks&amp;gt;
  public static SingletonLogger Instance
  {
    get
    {
      if ( _uniqueLogger == null )
      {
        _uniqueLogger = new SingletonLogger();
      }
      return _uniqueLogger;
    }
  }

  /// &amp;lt;summary&amp;gt;
  /// ログ出力
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;param name="message"&amp;gt;&amp;lt;/param&amp;gt;
  public void WriteLog(string message)
  {
    // ログ出力処理
    // ・・・
  }
}
&lt;/pre&gt;
&lt;h5&gt;VB&lt;/h5&gt;&lt;pre class="VB" name="code"&gt;''' &amp;lt;summary&amp;gt;
''' ログ出力クラス
''' &amp;lt;/summary&amp;gt;
''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;
Public Class SingletonLogger

  ''' &amp;lt;summary&amp;gt;
  ''' ログ出力パス
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;
  Private _logPath As String

  ''' &amp;lt;summary&amp;gt;
  ''' プロパティ ログ出力パス
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;
  ''' &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
  ''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;
  Public ReadOnly Property LogPath() As String
    Get
      Return _logPath
    End Get
  End Property

  ''' &amp;lt;summary&amp;gt;
  ''' コンストラクタ
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;remarks&amp;gt;new でインスタンス化できないよう、privateでコンストラクタを定義&amp;lt;/remarks&amp;gt;
  Private Sub New()
    _logPath = DateTime.Now.ToString("yyyyMMddhhmmssfff") &amp;amp; ".log"
  End Sub

  ''' &amp;lt;summary&amp;gt;
  ''' 自身の唯一のインスタンス
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;
  Private Shared _uniqueLogger As SingletonLogger

  ''' &amp;lt;summary&amp;gt;
  ''' プロパティ インスタンス
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;value&amp;gt;&amp;lt;/value&amp;gt;
  ''' &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
  ''' &amp;lt;remarks&amp;gt;自身の唯一のインスタンスを返す&amp;lt;/remarks&amp;gt;
  Public Shared ReadOnly Property Instance() As SingletonLogger
    Get
      If _uniqueLogger Is Nothing Then
        _uniqueLogger = New SingletonLogger
      End If
      Return _uniqueLogger
    End Get
  End Property

  ''' &amp;lt;summary&amp;gt;
  ''' ログ出力
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;param name="message"&amp;gt;&amp;lt;/param&amp;gt;
  Public Sub WriteLog(ByVal message As String)
    ' ログ出力処理
    ' ・・・
  End Sub

End Class
&lt;/pre&gt;
&lt;p&gt;このコードのポイントは以下の3点です。
&lt;ul&gt;
&lt;li&gt;コンストラクタをprivateとして、外からはインスタンス化できないようにする。&lt;/li&gt;
&lt;li&gt;privateな静的フィールドとして、自身の型のフィールドを用意し、クライアントにはそれを提供するようにする。&lt;/li&gt;
&lt;li&gt;Instanceプロパティ内で、上記静的フィールドがnullの場合のみ、新たにインスタンス化するようにし、唯一のオブジェクトを保障する。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp; &lt;p&gt;以上のコードを使って見ましょう。 
&lt;h5&gt;C#&lt;/h5&gt;&lt;pre class="c#" name="code"&gt;public class Program
{
  static void Main(string[] args)
  {
    {
      var logger = SingletonLogger.Instance;
      Console.WriteLine(logger.LogPath);
    }

    System.Threading.Thread.Sleep(1000);

    {
      var logger = SingletonLogger.Instance;
      Console.WriteLine(logger.LogPath);
    }

    Console.ReadKey();
  }
}
&lt;/pre&gt;
&lt;h5&gt;VB&lt;/h5&gt;&lt;pre class="VB" name="code"&gt;Public Class Program

  Public Shared Sub Main()

    With Nothing
      Dim logger = SingletonLogger.Instance
      Console.WriteLine(logger.LogPath)
    End With

    System.Threading.Thread.Sleep(1000)

    With Nothing
      Dim logger = SingletonLogger.Instance
      Console.WriteLine(logger.LogPath)
    End With

    Console.ReadKey()

  End Sub

End Class
&lt;/pre&gt;
&lt;h4&gt;実行結果&lt;/h4&gt;&lt;pre class="code" style="margin-top: 0.5em"&gt;20080608125533068.log
20080608125533068.log
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; &lt;p&gt;実行結果を見るとわかるように、1つのインスタンスが使いまわされていることがわかります。 
&lt;p&gt;&amp;nbsp; &lt;p&gt;さて、以上のコードは、通常の使用方法では問題がないのですが、以下のようにマルチスレッドで動かす場合、1つだけであるはずのインスタンスが、複数生成されてしまうことがあります。 
&lt;h5&gt;C#&lt;/h5&gt;&lt;pre class="c#" name="code"&gt;/// ログ出力クラス
/// &amp;lt;/summary&amp;gt;
public class SingletonLogger
{
  ・・・

  /// &amp;lt;summary&amp;gt;
  /// コンストラクタ
  /// &amp;lt;/summary&amp;gt;
  /// &amp;lt;remarks&amp;gt;new でインスタンス化できないよう、privateでコンストラクタを定義&amp;lt;/remarks&amp;gt;
  private SingletonLogger()
  {
    // 重い初期化処理
    for ( var i = 0; i &amp;lt; 100000000; i++ )
    {
    }

    _logPath = DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".log";
  }

  ・・・
}

public class Program
{
  static void Main(string[] args)
  {
    SingletonLogger logger1 = null;
    var thread1 = new Thread(
      () =&amp;gt;
      {
        logger1 = SingletonLogger.Instance;
      }
    );
    SingletonLogger logger2 = null;
    var thread2 = new Thread(
      () =&amp;gt;
      {
        logger2 = SingletonLogger.Instance;
      }
    );

    thread1.Start();
    thread2.Start();

    while ( logger1 == null || logger2 == null)
    {
      Thread.Sleep(10);
    }

    Console.WriteLine(logger1.LogPath);
    Console.WriteLine(logger2.LogPath);

    Console.ReadKey();
  }
}
&lt;/pre&gt;
&lt;h5&gt;VB&lt;/h5&gt;&lt;pre class="VB" name="code"&gt;''' &amp;lt;summary&amp;gt;
''' ログ出力クラス
''' &amp;lt;/summary&amp;gt;
''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;
Public Class SingletonLogger

  ・・・

  ''' &amp;lt;summary&amp;gt;
  ''' コンストラクタ
  ''' &amp;lt;/summary&amp;gt;
  ''' &amp;lt;remarks&amp;gt;new でインスタンス化できないよう、privateでコンストラクタを定義&amp;lt;/remarks&amp;gt;
  Private Sub New()
    ' 重い初期化処理
    For i As Integer = 0 To 100000000
    Next i

    _logPath = DateTime.Now.ToString("yyyyMMddhhmmssfff") &amp;amp; ".log"
  End Sub

  ・・・

End Class

Public Class Program

  Public Shared Sub Main()

    Dim loggerHelper1 As New LoggerHelper()
    Dim thread1 = New Thread(AddressOf loggerHelper1.SetLogger)

    Dim loggerHelper2 As New LoggerHelper()
    Dim thread2 = New Thread(AddressOf loggerHelper2.SetLogger)

    thread1.Start()
    thread2.Start()

    While (loggerHelper1.Logger Is Nothing OrElse loggerHelper2.Logger Is Nothing)
      Thread.Sleep(10)
    End While

    Console.WriteLine(loggerHelper1.Logger.LogPath)
    Console.WriteLine(loggerHelper2.Logger.LogPath)

    Console.ReadKey()

  End Sub

  Public Class LoggerHelper

    Public Logger As SingletonLogger

    Public Sub SetLogger()
      Me.Logger = SingletonLogger.Instance
    End Sub
  End Class

End Class
&lt;/pre&gt;
&lt;h4&gt;実行結果&lt;/h4&gt;&lt;pre class="code" style="margin-top: 0.5em"&gt;20080608011949432.log
20080608011949613.log
&lt;/pre&gt;
&lt;p&gt;ごらんのように、インスタンスが２つ生成された結果、ログ出力パスが変わってしまいます。 
&lt;p&gt;この問題を解消する方法はないのでしょうか？ 
&lt;p&gt;&amp;nbsp; &lt;p&gt;実はあります。このあたり、次回のエントリで取り上げようと思います。 
&lt;p&gt;&amp;nbsp; &lt;p&gt;＃今回から、.NET Framework 3.5 のコードにしています。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/masaru/aggbug/142217.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まさる</dc:creator><title>デザインパターンを学ぶ～その１６：Factoryパターン(3)～</title><link>http://blogs.wankuma.com/masaru/archive/2008/02/27/125280.aspx</link><pubDate>Wed, 27 Feb 2008 23:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/masaru/archive/2008/02/27/125280.aspx</guid><wfw:comment>http://blogs.wankuma.com/masaru/comments/125280.aspx</wfw:comment><comments>http://blogs.wankuma.com/masaru/archive/2008/02/27/125280.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/masaru/comments/commentRss/125280.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/masaru/services/trackbacks/125280.aspx</trackback:ping><description>&lt;p&gt;記念すべき100エントリ目となりました。いい加減にシリーズ再開せねばということで、&lt;a href="http://blogs.wankuma.com/masaru/archive/2007/11/07/106471.aspx" target="_blank"&gt;前回&lt;/a&gt;から間が空きましたが、今回はAbstract Factoryパターンを取り上げます。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Abstract Factoryパターンは、具象クラスに依存することなく、一連の関連するオブジェクトを生成するためのインタフェイスを提供します。&lt;/p&gt; &lt;p&gt;具体的には、例えばGUIインタフェイスでスキンを指定したら、それに紐付くボタン、枠、スクロールバーなどを生成する、といった用途で使われているようですね。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;では、コード例です。今回はお弁当の種類に応じたごはんとおかずを作るFactoryをコードにしてみます。&lt;/p&gt; &lt;ol&gt; &lt;li&gt;生成される製品の抽象クラスを定義します。  &lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt;;
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt;;
  }
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustInherit&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustOverride&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustInherit&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustOverride&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;1.で作成した抽象製品クラスを継承し、具象製品クラスを定義します。 
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;ごはん&lt;/span&gt; : &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt; { &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;"ごはん"&lt;/span&gt;; }
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;ふりかけごはん&lt;/span&gt; : &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt; { &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;"ふりかけごはん"&lt;/span&gt;; }
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;ごま塩ごはん&lt;/span&gt; : &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt; { &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;"ごま塩ごはん"&lt;/span&gt;; }
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;梅干し&lt;/span&gt; : &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt; { &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;"梅干し"&lt;/span&gt;; }
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;から揚げ&lt;/span&gt; : &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt; { &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;"から揚げ"&lt;/span&gt;; }
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;玉子焼き&lt;/span&gt; : &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt; { &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;"玉子焼き"&lt;/span&gt;; }
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;焼き鮭&lt;/span&gt; : &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt; { &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;"焼き鮭"&lt;/span&gt;; }
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;煮物&lt;/span&gt; : &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt; { &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;"煮物"&lt;/span&gt;; }
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;ウインナ&lt;/span&gt; : &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;
  {
    &lt;span class="keyword"&gt;get&lt;/span&gt; { &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;"ウインナ"&lt;/span&gt;; }
  }
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;ごはん&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;
    &lt;span class="keyword"&gt;Get&lt;/span&gt;
      &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;"ごはん"&lt;/span&gt;
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Get&lt;/span&gt;
  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;ふりかけごはん&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;
    &lt;span class="keyword"&gt;Get&lt;/span&gt;
      &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;"ふりかけごはん"&lt;/span&gt;
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Get&lt;/span&gt;
  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;ごま塩ごはん&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;
    &lt;span class="keyword"&gt;Get&lt;/span&gt;
      &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;"ごま塩ごはん"&lt;/span&gt;
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Get&lt;/span&gt;
  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;梅干し&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;
    &lt;span class="keyword"&gt;Get&lt;/span&gt;
      &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;"梅干し"&lt;/span&gt;
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Get&lt;/span&gt;
  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;から揚げ&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;
    &lt;span class="keyword"&gt;Get&lt;/span&gt;
      &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;"から揚げ"&lt;/span&gt;
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Get&lt;/span&gt;
  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;玉子焼き&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;
    &lt;span class="keyword"&gt;Get&lt;/span&gt;
      &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;"玉子焼き"&lt;/span&gt;
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Get&lt;/span&gt;
  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;焼き鮭&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;
    &lt;span class="keyword"&gt;Get&lt;/span&gt;
      &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;"焼き鮭"&lt;/span&gt;
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Get&lt;/span&gt;
  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;煮物&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;
    &lt;span class="keyword"&gt;Get&lt;/span&gt;
      &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;"煮物"&lt;/span&gt;
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Get&lt;/span&gt;
  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;ウインナ&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;ReadOnly&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;名前&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;
    &lt;span class="keyword"&gt;Get&lt;/span&gt;
      &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;"煮物"&lt;/span&gt;
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Get&lt;/span&gt;
  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Property&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;1.で作成した抽象クラスそれぞれを生成するメソッド（Factory Method）を持つ、抽象Factoryクラスを定義します。 
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Abstractお弁当Factory&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt; &lt;span class="id"&gt;Createごはん&lt;/span&gt;();
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;[] &lt;span class="id"&gt;Createおかず&lt;/span&gt;();
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustInherit&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Abstractお弁当Factory&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustOverride&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;Createご飯&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;
  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustOverride&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;Createおかず&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;()

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;3.で作成した抽象クラスを継承し、具象Factoryクラスを定義します。 
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;日の丸弁当Factory&lt;/span&gt; : &lt;span class="id"&gt;Abstractお弁当Factory&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt; &lt;span class="id"&gt;Createごはん&lt;/span&gt;()
  {
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;ごはん&lt;/span&gt;();
  }

  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;[] &lt;span class="id"&gt;Createおかず&lt;/span&gt;()
  {
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;[] { &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;梅干し&lt;/span&gt;() };
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;和風弁当Factory&lt;/span&gt; : &lt;span class="id"&gt;Abstractお弁当Factory&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt; &lt;span class="id"&gt;Createごはん&lt;/span&gt;()
  {
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;ごま塩ごはん&lt;/span&gt;();
  }

  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;[] &lt;span class="id"&gt;Createおかず&lt;/span&gt;()
  {
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;[] {
      &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;梅干し&lt;/span&gt;()
      , &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;焼き鮭&lt;/span&gt;()
      , &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;煮物&lt;/span&gt;()
    };
  }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;こども弁当Factory&lt;/span&gt; : &lt;span class="id"&gt;Abstractお弁当Factory&lt;/span&gt;
{
  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt; &lt;span class="id"&gt;Createごはん&lt;/span&gt;()
  {
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;ふりかけごはん&lt;/span&gt;();
  }

  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;[] &lt;span class="id"&gt;Createおかず&lt;/span&gt;()
  {
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;[] {
      &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;ウインナ&lt;/span&gt;()
      , &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;玉子焼き&lt;/span&gt;()
      , &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;から揚げ&lt;/span&gt;()
    };
  }
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;日の丸弁当Factory&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractお弁当Factory&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;Createご飯&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;

    &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;ごはん&lt;/span&gt;()

  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;Createおかず&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;()

    &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;() {&lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;梅干し&lt;/span&gt;()}

  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;和風弁当Factory&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractお弁当Factory&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;Createご飯&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;

    &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;ごま塩ごはん&lt;/span&gt;()

  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;Createおかず&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;()

    &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;() { &lt;span class="id"&gt;_&lt;/span&gt;
     &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;梅干し&lt;/span&gt;() &lt;span class="id"&gt;_&lt;/span&gt;
     , &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;焼き鮭&lt;/span&gt;() &lt;span class="id"&gt;_&lt;/span&gt;
     , &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;煮物&lt;/span&gt;() &lt;span class="id"&gt;_&lt;/span&gt;
     }

  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;こども弁当Factory&lt;/span&gt;
  &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Abstractお弁当Factory&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;Createご飯&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;

    &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;ふりかけごはん&lt;/span&gt;()

  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;Createおかず&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;()

    &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;() { &lt;span class="id"&gt;_&lt;/span&gt;
     &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;ウインナ&lt;/span&gt;() &lt;span class="id"&gt;_&lt;/span&gt;
     , &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;玉子焼き&lt;/span&gt;() &lt;span class="id"&gt;_&lt;/span&gt;
     , &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;から揚げ&lt;/span&gt;() &lt;span class="id"&gt;_&lt;/span&gt;
     }

  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;1～4.で作成したクラス群を使用する、Clientクラスを定義します。 
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;お弁当Client&lt;/span&gt;
{
  &lt;span class="keyword"&gt;private&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt; &lt;span class="id"&gt;ごはん&lt;/span&gt;;
  &lt;span class="keyword"&gt;private&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;[] &lt;span class="id"&gt;おかず&lt;/span&gt;;
  &lt;span class="keyword"&gt;private&lt;/span&gt; &lt;span class="id"&gt;Abstractお弁当Factory&lt;/span&gt; &lt;span class="id"&gt;お弁当Factory&lt;/span&gt;;

  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="id"&gt;お弁当Client&lt;/span&gt;(&lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;種類&lt;/span&gt;)
  {
    &lt;span class="keyword"&gt;if&lt;/span&gt; ( &lt;span class="id"&gt;種類&lt;/span&gt; == &lt;span class="literal"&gt;"日の丸"&lt;/span&gt; )
    {
      &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;お弁当Factory&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;日の丸弁当Factory&lt;/span&gt;();
    }
    &lt;span class="keyword"&gt;else&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; ( &lt;span class="id"&gt;種類&lt;/span&gt; == &lt;span class="literal"&gt;"和風"&lt;/span&gt; )
    {
      &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;お弁当Factory&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;和風弁当Factory&lt;/span&gt;();
    }
    &lt;span class="keyword"&gt;else&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; ( &lt;span class="id"&gt;種類&lt;/span&gt; == &lt;span class="literal"&gt;"こども"&lt;/span&gt; )
    {
      &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;お弁当Factory&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;こども弁当Factory&lt;/span&gt;();
    }
  }

  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;お弁当作成&lt;/span&gt;()
  {
    &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;ごはん&lt;/span&gt; = &lt;span class="id"&gt;お弁当Factory&lt;/span&gt;.&lt;span class="id"&gt;Createごはん&lt;/span&gt;();
    &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;おかず&lt;/span&gt; = &lt;span class="id"&gt;お弁当Factory&lt;/span&gt;.&lt;span class="id"&gt;Createおかず&lt;/span&gt;();
  }

  &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;ToString&lt;/span&gt;()
  {
    &lt;span class="id"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="keyword"&gt;string&lt;/span&gt;&amp;gt; &lt;span class="id"&gt;おかず名List&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="keyword"&gt;string&lt;/span&gt;&amp;gt;();
    &lt;span class="keyword"&gt;foreach&lt;/span&gt; ( &lt;span class="id"&gt;Abstractおかず&lt;/span&gt; &lt;span class="id"&gt;おかず単品&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="id"&gt;おかず&lt;/span&gt; )
    {
      &lt;span class="id"&gt;おかず名List&lt;/span&gt;.&lt;span class="id"&gt;Add&lt;/span&gt;(&lt;span class="id"&gt;おかず単品&lt;/span&gt;.&lt;span class="id"&gt;名前&lt;/span&gt;);
    }
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="id"&gt;String&lt;/span&gt;.&lt;span class="id"&gt;Format&lt;/span&gt;(
        &lt;span class="literal"&gt;"{0}におかずとして、{1}が付いています。"&lt;/span&gt;
      , &lt;span class="id"&gt;ごはん&lt;/span&gt;.&lt;span class="id"&gt;名前&lt;/span&gt;
      , &lt;span class="id"&gt;String&lt;/span&gt;.&lt;span class="id"&gt;Join&lt;/span&gt;(&lt;span class="literal"&gt;"、"&lt;/span&gt;, &lt;span class="id"&gt;おかず名List&lt;/span&gt;.&lt;span class="id"&gt;ToArray&lt;/span&gt;())
      );
  }
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;お弁当Client&lt;/span&gt;

  &lt;span class="keyword"&gt;Private&lt;/span&gt; &lt;span class="id"&gt;ごはん&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractごはん&lt;/span&gt;
  &lt;span class="keyword"&gt;Private&lt;/span&gt; &lt;span class="id"&gt;おかず&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt;()
  &lt;span class="keyword"&gt;Private&lt;/span&gt; &lt;span class="id"&gt;お弁当Factory&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractお弁当Factory&lt;/span&gt;

  &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt;(&lt;span class="keyword"&gt;ByVal&lt;/span&gt; &lt;span class="id"&gt;種類&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;)

    &lt;span class="keyword"&gt;If&lt;/span&gt; &lt;span class="id"&gt;種類&lt;/span&gt; = &lt;span class="literal"&gt;"日の丸"&lt;/span&gt; &lt;span class="keyword"&gt;Then&lt;/span&gt;

      &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;お弁当Factory&lt;/span&gt; = &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;日の丸弁当Factory&lt;/span&gt;()

    &lt;span class="keyword"&gt;ElseIf&lt;/span&gt; &lt;span class="id"&gt;種類&lt;/span&gt; = &lt;span class="literal"&gt;"和風"&lt;/span&gt; &lt;span class="keyword"&gt;Then&lt;/span&gt;

      &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;お弁当Factory&lt;/span&gt; = &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;和風弁当Factory&lt;/span&gt;()

    &lt;span class="keyword"&gt;ElseIf&lt;/span&gt; &lt;span class="id"&gt;種類&lt;/span&gt; = &lt;span class="literal"&gt;"こども"&lt;/span&gt; &lt;span class="keyword"&gt;Then&lt;/span&gt;

      &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;お弁当Factory&lt;/span&gt; = &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;こども弁当Factory&lt;/span&gt;()

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;If&lt;/span&gt;

  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;お弁当作成&lt;/span&gt;()

    &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;ごはん&lt;/span&gt; = &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;お弁当Factory&lt;/span&gt;.&lt;span class="id"&gt;Createご飯&lt;/span&gt;()
    &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;おかず&lt;/span&gt; = &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;お弁当Factory&lt;/span&gt;.&lt;span class="id"&gt;Createおかず&lt;/span&gt;()

  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;ToString&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;

    &lt;span class="keyword"&gt;Dim&lt;/span&gt; &lt;span class="id"&gt;おかず名List&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;List&lt;/span&gt;(&lt;span class="id"&gt;Of&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;)()

    &lt;span class="keyword"&gt;For&lt;/span&gt; &lt;span class="keyword"&gt;Each&lt;/span&gt; &lt;span class="id"&gt;おかず単品&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Abstractおかず&lt;/span&gt; &lt;span class="keyword"&gt;In&lt;/span&gt; &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;おかず&lt;/span&gt;

      &lt;span class="id"&gt;おかず名List&lt;/span&gt;.&lt;span class="id"&gt;Add&lt;/span&gt;(&lt;span class="id"&gt;おかず単品&lt;/span&gt;.&lt;span class="id"&gt;名前&lt;/span&gt;)

    &lt;span class="keyword"&gt;Next&lt;/span&gt;

    &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;.&lt;span class="id"&gt;Format&lt;/span&gt;( &lt;span class="id"&gt;_&lt;/span&gt;
     &lt;span class="literal"&gt;"{0}におかずとして、{1}が付いています。"&lt;/span&gt; &lt;span class="id"&gt;_&lt;/span&gt;
     , &lt;span class="id"&gt;ごはん&lt;/span&gt;.&lt;span class="id"&gt;名前&lt;/span&gt; &lt;span class="id"&gt;_&lt;/span&gt;
     , &lt;span class="keyword"&gt;String&lt;/span&gt;.&lt;span class="id"&gt;Join&lt;/span&gt;(&lt;span class="literal"&gt;"、"&lt;/span&gt;, &lt;span class="id"&gt;おかず名List&lt;/span&gt;.&lt;span class="id"&gt;ToArray&lt;/span&gt;()) &lt;span class="id"&gt;_&lt;/span&gt;
     )

  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;上記コードを実行してみます。&lt;/p&gt;
&lt;h4&gt;実行コード&lt;/h4&gt;
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Program&lt;/span&gt;
{
  &lt;span class="keyword"&gt;static&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Main&lt;/span&gt;(&lt;span class="keyword"&gt;string&lt;/span&gt;[] &lt;span class="id"&gt;args&lt;/span&gt;)
  {
    &lt;span class="id"&gt;お弁当Client&lt;/span&gt; &lt;span class="id"&gt;client&lt;/span&gt;;

    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"日の丸弁当："&lt;/span&gt;);
    &lt;span class="id"&gt;client&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;お弁当Client&lt;/span&gt;(&lt;span class="literal"&gt;"日の丸"&lt;/span&gt;);
    &lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;お弁当作成&lt;/span&gt;();
    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;ToString&lt;/span&gt;());

    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"和風弁当："&lt;/span&gt;);
    &lt;span class="id"&gt;client&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;お弁当Client&lt;/span&gt;(&lt;span class="literal"&gt;"和風"&lt;/span&gt;);
    &lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;お弁当作成&lt;/span&gt;();
    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;ToString&lt;/span&gt;());

    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"こども弁当："&lt;/span&gt;);
    &lt;span class="id"&gt;client&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;お弁当Client&lt;/span&gt;(&lt;span class="literal"&gt;"こども"&lt;/span&gt;);
    &lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;お弁当作成&lt;/span&gt;();
    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;ToString&lt;/span&gt;());

    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;ReadKey&lt;/span&gt;();
  }
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Program&lt;/span&gt;

  &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Shared&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Main&lt;/span&gt;(&lt;span class="keyword"&gt;ByVal&lt;/span&gt; &lt;span class="id"&gt;args&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;())

    &lt;span class="keyword"&gt;Dim&lt;/span&gt; &lt;span class="id"&gt;client&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;お弁当Client&lt;/span&gt;

    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"日の丸弁当："&lt;/span&gt;)
    &lt;span class="id"&gt;client&lt;/span&gt; = &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;お弁当Client&lt;/span&gt;(&lt;span class="literal"&gt;"日の丸"&lt;/span&gt;)
    &lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;お弁当作成&lt;/span&gt;()
    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;ToString&lt;/span&gt;())

    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"和風弁当："&lt;/span&gt;)
    &lt;span class="id"&gt;client&lt;/span&gt; = &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;お弁当Client&lt;/span&gt;(&lt;span class="literal"&gt;"和風"&lt;/span&gt;)
    &lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;お弁当作成&lt;/span&gt;()
    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;ToString&lt;/span&gt;())

    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"こども弁当："&lt;/span&gt;)
    &lt;span class="id"&gt;client&lt;/span&gt; = &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;お弁当Client&lt;/span&gt;(&lt;span class="literal"&gt;"こども"&lt;/span&gt;)
    &lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;お弁当作成&lt;/span&gt;()
    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="id"&gt;client&lt;/span&gt;.&lt;span class="id"&gt;ToString&lt;/span&gt;())

    &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;ReadKey&lt;/span&gt;()

  &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;
&lt;h4&gt;実行結果&lt;/h4&gt;&lt;pre class="code" style="margin-top: 0.5em"&gt;日の丸弁当：
ごはんにおかずとして、梅干しが付いています。
和風弁当：
ごま塩ごはんにおかずとして、梅干し、焼き鮭、煮物が付いています。
こども弁当：
ふりかけごはんにおかずとして、ウインナ、玉子焼き、から揚げが付いています。
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;さて、上記のコードをよく見てみると、気付くことがあります。&lt;/p&gt;
&lt;p&gt;まずは、3.で定義した抽象Factoryですが、そのメンバである製品を生成するメソッドは、前回紹介したFactory Methodパターンとなっています。&lt;/p&gt;
&lt;p&gt;また、Clientクラスの中で、抽象Factoryクラスの変数に、具象Factoryのインスタンスを切り替えて設定し、Factoryメソッドを実行している箇所は、Strategyパターンになっていますね。（この辺の話は以前&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/01/25/119163.aspx" target="_blank"&gt;凪瀬さんがまとめていらっしゃいます&lt;/a&gt;のでご一読をオススメします。）&lt;/p&gt;
&lt;p&gt;このように、あるパターンの中に他のパターンが紛れている、ということもGoFパターンにはちょくちょくあるようですので、その意味、役割を考えなければいけませんね。わたしももう少し勉強します(^^; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;さて、次回はFactoryパターンについてのまとめをお送りする予定です。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/masaru/aggbug/125280.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まさる</dc:creator><title>C#って文字列の比較を「&lt;」、「&gt;」で出来なかったのね・・・</title><link>http://blogs.wankuma.com/masaru/archive/2008/02/06/121513.aspx</link><pubDate>Wed, 06 Feb 2008 10:05:00 GMT</pubDate><guid>http://blogs.wankuma.com/masaru/archive/2008/02/06/121513.aspx</guid><wfw:comment>http://blogs.wankuma.com/masaru/comments/121513.aspx</wfw:comment><comments>http://blogs.wankuma.com/masaru/archive/2008/02/06/121513.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/masaru/comments/commentRss/121513.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/masaru/services/trackbacks/121513.aspx</trackback:ping><description>&lt;p&gt;いまさら・・・orz
&lt;/p&gt;
&lt;p&gt;＃VBでは出来るから、C#でも出来るかと思ってたよ・・・
&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/masaru/aggbug/121513.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まさる</dc:creator><title>var欲しい</title><link>http://blogs.wankuma.com/masaru/archive/2008/01/31/120221.aspx</link><pubDate>Thu, 31 Jan 2008 17:55:00 GMT</pubDate><guid>http://blogs.wankuma.com/masaru/archive/2008/01/31/120221.aspx</guid><wfw:comment>http://blogs.wankuma.com/masaru/comments/120221.aspx</wfw:comment><comments>http://blogs.wankuma.com/masaru/archive/2008/01/31/120221.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/masaru/comments/commentRss/120221.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/masaru/services/trackbacks/120221.aspx</trackback:ping><description>&lt;p&gt;
C# 2.0で型付データセット使ってごにょごにょしてると、クラス名が長くなっていちいち書くのがめんどい・・・
&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/masaru/aggbug/120221.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まさる</dc:creator><title>re: re: オブジェクト指向におけるFizzBuzz問題</title><link>http://blogs.wankuma.com/masaru/archive/2007/11/09/107220.aspx</link><pubDate>Fri, 09 Nov 2007 12:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/masaru/archive/2007/11/09/107220.aspx</guid><wfw:comment>http://blogs.wankuma.com/masaru/comments/107220.aspx</wfw:comment><comments>http://blogs.wankuma.com/masaru/archive/2007/11/09/107220.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/masaru/comments/commentRss/107220.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/masaru/services/trackbacks/107220.aspx</trackback:ping><description>&lt;p&gt;＃問題→&lt;a href="http://blogs.wankuma.com/episteme/archive/2007/11/08/106927.aspx"&gt;オブジェクト指向におけるFizzBuzz問題&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;＃前回→&lt;a id="viewpost.ascx_TitleUrl" href="http://blogs.wankuma.com/masaru/archive/2007/11/08/107051.aspx"&gt;re: オブジェクト指向におけるFizzBuzz問題&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ひろえむさんのコメントにより、さらに修正。&lt;/p&gt;
&lt;h5 class="cs-header"&gt;C#&lt;/h5&gt;
&lt;pre class="code"&gt;&lt;span class="id"&gt;public&lt;/span&gt; &lt;span class="id"&gt;abstract&lt;/span&gt; &lt;span class="id"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Animal&lt;/span&gt;
{
    &lt;span class="id"&gt;private&lt;/span&gt; &lt;span class="id"&gt;int&lt;/span&gt; &lt;span class="id"&gt;soundsCount&lt;/span&gt; = &lt;span class="id"&gt;1&lt;/span&gt;;

    &lt;span class="id"&gt;public&lt;/span&gt; &lt;span class="id"&gt;void&lt;/span&gt; &lt;span class="id"&gt;SetCount&lt;/span&gt;(&lt;span class="id"&gt;int&lt;/span&gt; &lt;span class="id"&gt;count&lt;/span&gt;)
    {
        &lt;span class="id"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;soundsCount&lt;/span&gt; = &lt;span class="id"&gt;count&lt;/span&gt;;
    }

    &lt;span class="id"&gt;protected&lt;/span&gt; &lt;span class="id"&gt;abstract&lt;/span&gt; &lt;span class="id"&gt;string&lt;/span&gt; &lt;span class="id"&gt;SoundsString&lt;/span&gt;
    {
        &lt;span class="id"&gt;get&lt;/span&gt;;
    }

    &lt;span class="id"&gt;public&lt;/span&gt; &lt;span class="id"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Sound&lt;/span&gt;()
    {
        &lt;span class="id"&gt;StringBuilder&lt;/span&gt; &lt;span class="id"&gt;sounds&lt;/span&gt; = &lt;span class="id"&gt;new&lt;/span&gt; &lt;span class="id"&gt;StringBuilder&lt;/span&gt;();
        &lt;span class="id"&gt;for&lt;/span&gt; ( &lt;span class="id"&gt;int&lt;/span&gt; &lt;span class="id"&gt;i&lt;/span&gt; = &lt;span class="id"&gt;0&lt;/span&gt;; &lt;span class="id"&gt;i&lt;/span&gt; &amp;lt; &lt;span class="id"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;soundsCount&lt;/span&gt;; &lt;span class="id"&gt;i&lt;/span&gt;++ )
        {
            &lt;span class="id"&gt;sounds&lt;/span&gt;.&lt;span class="id"&gt;Append&lt;/span&gt;(&lt;span class="id"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;SoundsString&lt;/span&gt;);
        }
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="id"&gt;sounds&lt;/span&gt;.&lt;span class="id"&gt;ToString&lt;/span&gt;());
    }
}

&lt;span class="id"&gt;public&lt;/span&gt; &lt;span class="id"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Cat&lt;/span&gt; : &lt;span class="id"&gt;Animal&lt;/span&gt;
{
    &lt;span class="id"&gt;protected&lt;/span&gt; &lt;span class="id"&gt;override&lt;/span&gt; &lt;span class="id"&gt;string&lt;/span&gt; &lt;span class="id"&gt;SoundsString&lt;/span&gt;
    {
        &lt;span class="id"&gt;get&lt;/span&gt;
        {
            &lt;span class="id"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;&amp;quot;にゃー&amp;quot;&lt;/span&gt;;
        }
    }
}

&lt;span class="id"&gt;public&lt;/span&gt; &lt;span class="id"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Dog&lt;/span&gt; : &lt;span class="id"&gt;Animal&lt;/span&gt;
{
    &lt;span class="id"&gt;protected&lt;/span&gt; &lt;span class="id"&gt;override&lt;/span&gt; &lt;span class="id"&gt;string&lt;/span&gt; &lt;span class="id"&gt;SoundsString&lt;/span&gt;
    {
        &lt;span class="id"&gt;get&lt;/span&gt;
        {
            &lt;span class="id"&gt;return&lt;/span&gt; &lt;span class="literal"&gt;&amp;quot;わん&amp;quot;&lt;/span&gt;;
        }
    }
}

&lt;span class="id"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Program&lt;/span&gt;
{
    &lt;span class="id"&gt;static&lt;/span&gt; &lt;span class="id"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Main&lt;/span&gt;(&lt;span class="id"&gt;string&lt;/span&gt;[] &lt;span class="id"&gt;args&lt;/span&gt;)
    {
        &lt;span class="id"&gt;Animal&lt;/span&gt; &lt;span class="id"&gt;animal&lt;/span&gt;;
        &lt;span class="id"&gt;animal&lt;/span&gt; = &lt;span class="id"&gt;new&lt;/span&gt; &lt;span class="id"&gt;Dog&lt;/span&gt;();
        &lt;span class="id"&gt;animal&lt;/span&gt;.&lt;span class="id"&gt;Sound&lt;/span&gt;();
        &lt;span class="id"&gt;animal&lt;/span&gt;.&lt;span class="id"&gt;SetCount&lt;/span&gt;(&lt;span class="id"&gt;3&lt;/span&gt;);
        &lt;span class="id"&gt;animal&lt;/span&gt;.&lt;span class="id"&gt;Sound&lt;/span&gt;();
        &lt;span class="id"&gt;animal&lt;/span&gt; = &lt;span class="id"&gt;new&lt;/span&gt; &lt;span class="id"&gt;Cat&lt;/span&gt;();
        &lt;span class="id"&gt;animal&lt;/span&gt;.&lt;span class="id"&gt;Sound&lt;/span&gt;();

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;Read&lt;/span&gt;();
    }
}
&lt;/pre&gt;
&lt;p&gt;せっかくなのでVB版も。&lt;/p&gt;
&lt;h5 class="vb-header"&gt;VB&lt;/h5&gt;
&lt;pre class="code"&gt;&lt;span class="id"&gt;Imports&lt;/span&gt; &lt;span class="id"&gt;System&lt;/span&gt;.&lt;span class="id"&gt;Text&lt;/span&gt;

&lt;span class="id"&gt;Public&lt;/span&gt; &lt;span class="id"&gt;MustInherit&lt;/span&gt; &lt;span class="id"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Animal&lt;/span&gt;

    &lt;span class="id"&gt;Private&lt;/span&gt; &lt;span class="id"&gt;soundsCount&lt;/span&gt; &lt;span class="id"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Integer&lt;/span&gt; = &lt;span class="id"&gt;1&lt;/span&gt;

    &lt;span class="id"&gt;Protected&lt;/span&gt; &lt;span class="id"&gt;MustOverride&lt;/span&gt; &lt;span class="id"&gt;ReadOnly&lt;/span&gt; &lt;span class="id"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;SoundsString&lt;/span&gt;() &lt;span class="id"&gt;As&lt;/span&gt; &lt;span class="id"&gt;String&lt;/span&gt;

    &lt;span class="id"&gt;Public&lt;/span&gt; &lt;span class="id"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;SetCount&lt;/span&gt;(&lt;span class="id"&gt;ByVal&lt;/span&gt; &lt;span class="id"&gt;count&lt;/span&gt; &lt;span class="id"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Integer&lt;/span&gt;)
        &lt;span class="id"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;soundsCount&lt;/span&gt; = &lt;span class="id"&gt;count&lt;/span&gt;
    &lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Sub&lt;/span&gt;

    &lt;span class="id"&gt;Public&lt;/span&gt; &lt;span class="id"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Sound&lt;/span&gt;()
        &lt;span class="id"&gt;Dim&lt;/span&gt; &lt;span class="id"&gt;sounds&lt;/span&gt; &lt;span class="id"&gt;As&lt;/span&gt; &lt;span class="id"&gt;New&lt;/span&gt; &lt;span class="id"&gt;StringBuilder&lt;/span&gt;()
        &lt;span class="id"&gt;For&lt;/span&gt; &lt;span class="id"&gt;i&lt;/span&gt; &lt;span class="id"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Integer&lt;/span&gt; = &lt;span class="id"&gt;1&lt;/span&gt; &lt;span class="id"&gt;To&lt;/span&gt; &lt;span class="id"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;soundsCount&lt;/span&gt;
            &lt;span class="id"&gt;sounds&lt;/span&gt;.&lt;span class="id"&gt;Append&lt;/span&gt;(&lt;span class="id"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;SoundsString&lt;/span&gt;())
        &lt;span class="id"&gt;Next&lt;/span&gt; &lt;span class="id"&gt;i&lt;/span&gt;
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="id"&gt;sounds&lt;/span&gt;.&lt;span class="id"&gt;ToString&lt;/span&gt;())
    &lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Sub&lt;/span&gt;

&lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Class&lt;/span&gt;

&lt;span class="id"&gt;Public&lt;/span&gt; &lt;span class="id"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Cat&lt;/span&gt;
    &lt;span class="id"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Animal&lt;/span&gt;

    &lt;span class="id"&gt;Protected&lt;/span&gt; &lt;span class="id"&gt;Overrides&lt;/span&gt; &lt;span class="id"&gt;ReadOnly&lt;/span&gt; &lt;span class="id"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;SoundsString&lt;/span&gt;() &lt;span class="id"&gt;As&lt;/span&gt; &lt;span class="id"&gt;String&lt;/span&gt;
        &lt;span class="id"&gt;Get&lt;/span&gt;
            &lt;span class="id"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;&amp;quot;にゃー&amp;quot;&lt;/span&gt;
        &lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Get&lt;/span&gt;
    &lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Property&lt;/span&gt;

&lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Class&lt;/span&gt;

&lt;span class="id"&gt;Public&lt;/span&gt; &lt;span class="id"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Dog&lt;/span&gt;
    &lt;span class="id"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;Animal&lt;/span&gt;

    &lt;span class="id"&gt;Protected&lt;/span&gt; &lt;span class="id"&gt;Overrides&lt;/span&gt; &lt;span class="id"&gt;ReadOnly&lt;/span&gt; &lt;span class="id"&gt;Property&lt;/span&gt; &lt;span class="id"&gt;SoundsString&lt;/span&gt;() &lt;span class="id"&gt;As&lt;/span&gt; &lt;span class="id"&gt;String&lt;/span&gt;
        &lt;span class="id"&gt;Get&lt;/span&gt;
            &lt;span class="id"&gt;Return&lt;/span&gt; &lt;span class="literal"&gt;&amp;quot;わん&amp;quot;&lt;/span&gt;
        &lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Get&lt;/span&gt;
    &lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Property&lt;/span&gt;

&lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Class&lt;/span&gt;

&lt;span class="id"&gt;Public&lt;/span&gt; &lt;span class="id"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Program&lt;/span&gt;

    &lt;span class="id"&gt;Public&lt;/span&gt; &lt;span class="id"&gt;Shared&lt;/span&gt; &lt;span class="id"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Main&lt;/span&gt;(&lt;span class="id"&gt;ByVal&lt;/span&gt; &lt;span class="id"&gt;args&lt;/span&gt; &lt;span class="id"&gt;As&lt;/span&gt; &lt;span class="id"&gt;String&lt;/span&gt;())

        &lt;span class="id"&gt;Dim&lt;/span&gt; &lt;span class="id"&gt;animal&lt;/span&gt; &lt;span class="id"&gt;As&lt;/span&gt; &lt;span class="id"&gt;Animal&lt;/span&gt;
        &lt;span class="id"&gt;animal&lt;/span&gt; = &lt;span class="id"&gt;New&lt;/span&gt; &lt;span class="id"&gt;Dog&lt;/span&gt;()
        &lt;span class="id"&gt;animal&lt;/span&gt;.&lt;span class="id"&gt;Sound&lt;/span&gt;()
        &lt;span class="id"&gt;animal&lt;/span&gt;.&lt;span class="id"&gt;SetCount&lt;/span&gt;(&lt;span class="id"&gt;3&lt;/span&gt;)
        &lt;span class="id"&gt;animal&lt;/span&gt;.&lt;span class="id"&gt;Sound&lt;/span&gt;()
        &lt;span class="id"&gt;animal&lt;/span&gt; = &lt;span class="id"&gt;New&lt;/span&gt; &lt;span class="id"&gt;Cat&lt;/span&gt;()
        &lt;span class="id"&gt;animal&lt;/span&gt;.&lt;span class="id"&gt;Sound&lt;/span&gt;()

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;Read&lt;/span&gt;()

    &lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Sub&lt;/span&gt;

&lt;span class="id"&gt;End&lt;/span&gt; &lt;span class="id"&gt;Class&lt;/span&gt;
&lt;/pre&gt;
&lt;img src ="http://blogs.wankuma.com/masaru/aggbug/107220.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まさる</dc:creator><title>re: オブジェクト指向におけるFizzBuzz問題</title><link>http://blogs.wankuma.com/masaru/archive/2007/11/08/107051.aspx</link><pubDate>Thu, 08 Nov 2007 21:30:00 GMT</pubDate><guid>http://blogs.wankuma.com/masaru/archive/2007/11/08/107051.aspx</guid><wfw:comment>http://blogs.wankuma.com/masaru/comments/107051.aspx</wfw:comment><comments>http://blogs.wankuma.com/masaru/archive/2007/11/08/107051.aspx#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://blogs.wankuma.com/masaru/comments/commentRss/107051.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/masaru/services/trackbacks/107051.aspx</trackback:ping><description>&lt;p&gt;＃問題→&lt;a href="http://blogs.wankuma.com/episteme/archive/2007/11/08/106927.aspx"&gt;オブジェクト指向におけるFizzBuzz問題&lt;/a&gt;&lt;/p&gt; &lt;p&gt;ってことでやってみました。&lt;/p&gt; &lt;h5 class="cs-header"&gt;C#&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Animal&lt;/span&gt;
{
    &lt;span class="keyword"&gt;private&lt;/span&gt; &lt;span class="keyword"&gt;int&lt;/span&gt; &lt;span class="id"&gt;soundsCount&lt;/span&gt;;
    &lt;span class="keyword"&gt;protected&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;soundsString&lt;/span&gt;;

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="id"&gt;Animal&lt;/span&gt;()
    {
        &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;soundsCount&lt;/span&gt; = &lt;span class="id"&gt;1&lt;/span&gt;;
    }

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Sound&lt;/span&gt;()
    {
        &lt;span class="id"&gt;StringBuilder&lt;/span&gt; &lt;span class="id"&gt;sounds&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;StringBuilder&lt;/span&gt;();
        &lt;span class="keyword"&gt;for&lt;/span&gt; ( &lt;span class="keyword"&gt;int&lt;/span&gt; &lt;span class="id"&gt;i&lt;/span&gt; = &lt;span class="id"&gt;0&lt;/span&gt;; &lt;span class="id"&gt;i&lt;/span&gt; &amp;lt; &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;soundsCount&lt;/span&gt;; &lt;span class="id"&gt;i&lt;/span&gt;++ )
        {
            &lt;span class="id"&gt;sounds&lt;/span&gt;.&lt;span class="id"&gt;Append&lt;/span&gt;(&lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;soundsString&lt;/span&gt;);
        }
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="id"&gt;sounds&lt;/span&gt;.&lt;span class="id"&gt;ToString&lt;/span&gt;());
    }

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;SetCount&lt;/span&gt;(&lt;span class="keyword"&gt;int&lt;/span&gt; &lt;span class="id"&gt;count&lt;/span&gt;)
    {
        &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;soundsCount&lt;/span&gt; = &lt;span class="id"&gt;count&lt;/span&gt;;
    }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Cat&lt;/span&gt; : &lt;span class="id"&gt;Animal&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="id"&gt;Cat&lt;/span&gt;()
    {
        &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;soundsString&lt;/span&gt; = &lt;span class="literal"&gt;"にゃー"&lt;/span&gt;;
    }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Dog&lt;/span&gt; : &lt;span class="id"&gt;Animal&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="id"&gt;Dog&lt;/span&gt;()
    {
        &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;soundsString&lt;/span&gt; = &lt;span class="literal"&gt;"わん"&lt;/span&gt;;
    }
}
&lt;/pre&gt;
&lt;p&gt;こんなかんじ？結果も確認済み。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;※追記&lt;/p&gt;
&lt;p&gt;だめだし食らったので再提出。Animalクラスを抽象クラスにしただけですけど。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/masaru/aggbug/107051.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まさる</dc:creator><title>デザインパターンを学ぶ～その１５：Factoryパターン(2)～</title><link>http://blogs.wankuma.com/masaru/archive/2007/11/07/106471.aspx</link><pubDate>Wed, 07 Nov 2007 00:57:00 GMT</pubDate><guid>http://blogs.wankuma.com/masaru/archive/2007/11/07/106471.aspx</guid><wfw:comment>http://blogs.wankuma.com/masaru/comments/106471.aspx</wfw:comment><comments>http://blogs.wankuma.com/masaru/archive/2007/11/07/106471.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/masaru/comments/commentRss/106471.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/masaru/services/trackbacks/106471.aspx</trackback:ping><description>&lt;p&gt;＃色々あって間が空きましたが、ようやくこのシリーズを再開します。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;さて、&lt;a href="http://blogs.wankuma.com/masaru/archive/2007/08/28/92433.aspx"&gt;前回&lt;/a&gt;はFactoryの基本ということで、Simple Factoryを取り上げました。今回はFactory Methodパターンを取り上げます。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Factory Methodパターンはインスタンス化するクラスをサブクラスに決定させるため、インスタンス化をサブクラスに先送りできます。これにより、実際にオブジェクトを使用するクラスから具象クラスへの依存がなくなります。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;といってもよくわからないので、コードを書いてみましょう。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;まず、生成されるオブジェクトのインタフェイスとなる抽象クラスAbstractMemberを定義します。ここで、インタフェイスとは広義の意味であり、interface（VBならInterface）で定義するインタフェイスのことではありません。  &lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt;
{
    &lt;span class="keyword"&gt;protected&lt;/span&gt; &lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;name&lt;/span&gt;;

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Speak&lt;/span&gt;();
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustInherit&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt;

    &lt;span class="keyword"&gt;Protected&lt;/span&gt; &lt;span class="id"&gt;name&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustOverride&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Speak&lt;/span&gt;()

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;AbstractMemberを継承した具象クラスMasaru, Epistemeを定義します。 
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Masaru&lt;/span&gt; : &lt;span class="id"&gt;AbstractMember&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="id"&gt;Masaru&lt;/span&gt;()
    {
        &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt; = &lt;span class="literal"&gt;"まさる"&lt;/span&gt;;
    }

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Speak&lt;/span&gt;()
    {
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"名前は{0}です。"&lt;/span&gt;, &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt;);
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"越後のとあるSIerで働いています。"&lt;/span&gt;);
    }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Episteme&lt;/span&gt; : &lt;span class="id"&gt;AbstractMember&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="id"&gt;Episteme&lt;/span&gt;()
    {
        &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt; = &lt;span class="literal"&gt;"επιστημη"&lt;/span&gt;;
    }

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Speak&lt;/span&gt;()
    {
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"名前は{0}です。"&lt;/span&gt;, &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt;);
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"わんくま茶藝部顧問です。"&lt;/span&gt;);
    }
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Masaru&lt;/span&gt;
    &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt;

    &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt;()

        &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt; = &lt;span class="literal"&gt;"まさる"&lt;/span&gt;

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Speak&lt;/span&gt;()

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"名前は{0}です。"&lt;/span&gt;, &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt;)
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"越後のとあるSIerで働いています。"&lt;/span&gt;)

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Episteme&lt;/span&gt;
    &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt;

    &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt;()

        &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt; = &lt;span class="literal"&gt;"επιστημη"&lt;/span&gt;

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Speak&lt;/span&gt;()

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"名前は{0}です。"&lt;/span&gt;, &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt;)
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"わんくま茶藝部顧問です。"&lt;/span&gt;)

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;AbstractMemberを生成するための抽象クラスAbstractCreatorを定義します。 
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;AbstractCreator&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;abstract&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt; &lt;span class="id"&gt;CreateMember&lt;/span&gt;();
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustInherit&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;AbstractCreator&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;MustOverride&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;CreateMember&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;AbstractCreatorを継承したインスタン生成のための具象クラスNormalMemberCreator、SuperMemberCreatorを定義します。 
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;NormalMemberCreator&lt;/span&gt; : &lt;span class="id"&gt;AbstractCreator&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt; &lt;span class="id"&gt;CreateMember&lt;/span&gt;()
    {
        &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;Masaru&lt;/span&gt;();
    }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;SuperMemberCreator&lt;/span&gt; : &lt;span class="id"&gt;AbstractCreator&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt; &lt;span class="id"&gt;CreateMember&lt;/span&gt;()
    {
        &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;Episteme&lt;/span&gt;();
    }
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;NormalMemberCreator&lt;/span&gt;
    &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;AbstractCreator&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;CreateMember&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt;

        &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;Masaru&lt;/span&gt;()

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;SuperMemberCreator&lt;/span&gt;
    &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;AbstractCreator&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;CreateMember&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt;

        &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;Episteme&lt;/span&gt;()

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;以上のコードを実行してみましょう。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;実行コード&lt;/h4&gt;
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;static&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Program&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;static&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Main&lt;/span&gt;(&lt;span class="keyword"&gt;string&lt;/span&gt;[] &lt;span class="id"&gt;args&lt;/span&gt;)
    {
        {
            &lt;span class="id"&gt;NormalMemberCreator&lt;/span&gt; &lt;span class="id"&gt;memberCreator&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;NormalMemberCreator&lt;/span&gt;();
            &lt;span class="id"&gt;AbstractMember&lt;/span&gt; &lt;span class="id"&gt;member&lt;/span&gt; = &lt;span class="id"&gt;memberCreator&lt;/span&gt;.&lt;span class="id"&gt;CreateMember&lt;/span&gt;();
            &lt;span class="id"&gt;member&lt;/span&gt;.&lt;span class="id"&gt;Speak&lt;/span&gt;();
        }

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;""&lt;/span&gt;);

        {
            &lt;span class="id"&gt;SuperMemberCreator&lt;/span&gt; &lt;span class="id"&gt;memberCreator&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;SuperMemberCreator&lt;/span&gt;();
            &lt;span class="id"&gt;AbstractMember&lt;/span&gt; &lt;span class="id"&gt;member&lt;/span&gt; = &lt;span class="id"&gt;memberCreator&lt;/span&gt;.&lt;span class="id"&gt;CreateMember&lt;/span&gt;();
            &lt;span class="id"&gt;member&lt;/span&gt;.&lt;span class="id"&gt;Speak&lt;/span&gt;();
        }

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;Read&lt;/span&gt;();
    }
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Program&lt;/span&gt;

    &lt;span class="keyword"&gt;Private&lt;/span&gt; &lt;span class="keyword"&gt;Shared&lt;/span&gt; &lt;span class="id"&gt;Block&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;Object&lt;/span&gt; = &lt;span class="keyword"&gt;Nothing&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Shared&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Main&lt;/span&gt;(&lt;span class="keyword"&gt;ByVal&lt;/span&gt; &lt;span class="id"&gt;args&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;())

        &lt;span class="keyword"&gt;With&lt;/span&gt; &lt;span class="id"&gt;Block&lt;/span&gt;

            &lt;span class="keyword"&gt;Dim&lt;/span&gt; &lt;span class="id"&gt;memberCreator&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;NormalMemberCreator&lt;/span&gt;()
            &lt;span class="keyword"&gt;Dim&lt;/span&gt; &lt;span class="id"&gt;member&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt; = &lt;span class="id"&gt;memberCreator&lt;/span&gt;.&lt;span class="id"&gt;CreateMember&lt;/span&gt;()
            &lt;span class="id"&gt;member&lt;/span&gt;.&lt;span class="id"&gt;Speak&lt;/span&gt;()

        &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;With&lt;/span&gt;

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;""&lt;/span&gt;)

        &lt;span class="keyword"&gt;With&lt;/span&gt; &lt;span class="id"&gt;Block&lt;/span&gt;

            &lt;span class="keyword"&gt;Dim&lt;/span&gt; &lt;span class="id"&gt;memberCreator&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;SuperMemberCreator&lt;/span&gt;()
            &lt;span class="keyword"&gt;Dim&lt;/span&gt; &lt;span class="id"&gt;member&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt; = &lt;span class="id"&gt;memberCreator&lt;/span&gt;.&lt;span class="id"&gt;CreateMember&lt;/span&gt;()
            &lt;span class="id"&gt;member&lt;/span&gt;.&lt;span class="id"&gt;Speak&lt;/span&gt;()

        &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;With&lt;/span&gt;

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;ReadLine&lt;/span&gt;()

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;
&lt;h4&gt;実行結果&lt;/h4&gt;&lt;pre class="code" style="margin-top: 0.5em"&gt;名前はまさるです。
越後のとあるSIerで働いています。

名前はεπιστημηです。
わんくま茶藝部顧問です。
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;上記の実行コードはSpeakメソッドを実装している具象クラスのことを知りません。これが依存性をなくしたということです。&lt;/p&gt;
&lt;p&gt;これによって何が良いのかというと、例えばMasaruクラスでなく、Torikobitoクラスに変更したい場合、実行コードに変更が必要ありません。あくまでTorikobitoクラスの追加と、NormalMemberCreatorの変更だけで済みます。&lt;/p&gt;
&lt;h4&gt;変更点&lt;/h4&gt;
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Torikobito&lt;/span&gt; : &lt;span class="id"&gt;AbstractMember&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="id"&gt;Torikobito&lt;/span&gt;()
    {
        &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt; = &lt;span class="literal"&gt;"とりこびと"&lt;/span&gt;;
    }

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Speak&lt;/span&gt;()
    {
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"名前は{0}です。"&lt;/span&gt;, &lt;span class="keyword"&gt;this&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt;);
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"Memo(Of T)管理人です。"&lt;/span&gt;);
    }
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;NormalMemberCreator&lt;/span&gt; : &lt;span class="id"&gt;AbstractCreator&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;override&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt; &lt;span class="id"&gt;CreateMember&lt;/span&gt;()
    {
        &lt;span class="comment"&gt;//return new Masaru();&lt;/span&gt;
        &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;Torikobito&lt;/span&gt;();
    }
}
&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Torikobito&lt;/span&gt;
    &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt;

    &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt;()

        &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt; = &lt;span class="literal"&gt;"とりこびと"&lt;/span&gt;

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Speak&lt;/span&gt;()

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"名前は{0}です。"&lt;/span&gt;, &lt;span class="keyword"&gt;Me&lt;/span&gt;.&lt;span class="id"&gt;name&lt;/span&gt;)
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"Memo(Of T)管理人です。"&lt;/span&gt;)

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;
&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;NormalMemberCreator&lt;/span&gt;
    &lt;span class="keyword"&gt;Inherits&lt;/span&gt; &lt;span class="id"&gt;AbstractCreator&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Overrides&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;CreateMember&lt;/span&gt;() &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;AbstractMember&lt;/span&gt;

        &lt;span class="comment"&gt;'Return New Masaru()&lt;/span&gt;
        &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;Torikobito&lt;/span&gt;()

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/pre&gt;
&lt;h4&gt;実行結果&lt;/h4&gt;&lt;pre class="code" style="margin-top: 0.5em"&gt;名前はとりこびとです。
Memo(Of T)管理人です。

名前はεπιστημηです。
わんくま茶藝部顧問です。
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ということで、今回はFactory Methodパターンをお送りしましたが、私自身まだこのパターンの有用性が理解し切れていません。実際に「こんなときに使ったよ」などありましたらコメントで教えてください。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/masaru/aggbug/106471.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>まさる</dc:creator><title>デザインパターンを学ぶ～その１４：Factoryパターン(1)～</title><link>http://blogs.wankuma.com/masaru/archive/2007/08/28/92433.aspx</link><pubDate>Tue, 28 Aug 2007 22:35:00 GMT</pubDate><guid>http://blogs.wankuma.com/masaru/archive/2007/08/28/92433.aspx</guid><wfw:comment>http://blogs.wankuma.com/masaru/comments/92433.aspx</wfw:comment><comments>http://blogs.wankuma.com/masaru/archive/2007/08/28/92433.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/masaru/comments/commentRss/92433.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/masaru/services/trackbacks/92433.aspx</trackback:ping><description>&lt;blockquote&gt;&lt;strong&gt;Factory　（ファクトリー）&lt;/strong&gt;&lt;br&gt;　工場 &lt;/blockquote&gt; &lt;p&gt;Factoryパターンは、「工場」という名の通り、インスタンスを作り出すクラスを定義するパターンです。&lt;/p&gt; &lt;p&gt;このパターンを適用することにより、インスタンスの生成方法を気にすることなく使用することができるようになり、オブジェクト間の結合が"疎"になります。&lt;/p&gt; &lt;p&gt;まずはSimple Factoryからやっていきます。Simple Factoryは実際はデザインパターンではないそうですが、Factoryの簡単なイメージが得られると思います。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;では、コードを示します。&lt;/p&gt; &lt;ol&gt; &lt;li&gt;具象クラスの元となるInterfaceを定義します。  &lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;interface&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt;
{
    &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Output&lt;/span&gt;();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Interface&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt;

    &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Output&lt;/span&gt;()

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Interface&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;li&gt;1.のInterfaceを継承して具象クラスを定義します。 
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;HogeObject&lt;/span&gt; : &lt;span class="id"&gt;IObject&lt;/span&gt;
{

    &lt;span class="preprocessor"&gt;#region&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt; &lt;span class="id"&gt;メンバ&lt;/span&gt;

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Output&lt;/span&gt;()
    {
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"ほげ"&lt;/span&gt;);
    }

    &lt;span class="preprocessor"&gt;#endregion&lt;/span&gt;
}

&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;FooObject&lt;/span&gt; : &lt;span class="id"&gt;IObject&lt;/span&gt;
{
    &lt;span class="preprocessor"&gt;#region&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt; &lt;span class="id"&gt;メンバ&lt;/span&gt;

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Output&lt;/span&gt;()
    {
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"ふー"&lt;/span&gt;);
    }

    &lt;span class="preprocessor"&gt;#endregion&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;HogeObject&lt;/span&gt;
    &lt;span class="keyword"&gt;Implements&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Output&lt;/span&gt;() &lt;span class="keyword"&gt;Implements&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt;.&lt;span class="id"&gt;Output&lt;/span&gt;
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"ほげ"&lt;/span&gt;)
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;

&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;FooObject&lt;/span&gt;
    &lt;span class="keyword"&gt;Implements&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Output&lt;/span&gt;() &lt;span class="keyword"&gt;Implements&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt;.&lt;span class="id"&gt;Output&lt;/span&gt;
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"ふー"&lt;/span&gt;)
    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;li&gt;文字列を引数とし、その値によってインスタンスを生成する具象クラスを切り替えるFactoryクラスを定義します。 
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;SimpleFactory&lt;/span&gt;
{
    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt; &lt;span class="id"&gt;CreateHoge&lt;/span&gt;(&lt;span class="keyword"&gt;string&lt;/span&gt; &lt;span class="id"&gt;objectName&lt;/span&gt;)
    {
        &lt;span class="keyword"&gt;if&lt;/span&gt; ( &lt;span class="id"&gt;objectName&lt;/span&gt; == &lt;span class="literal"&gt;"ほげ"&lt;/span&gt; )
        {
            &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;HogeObject&lt;/span&gt;();
        }
        &lt;span class="keyword"&gt;else&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; ( &lt;span class="id"&gt;objectName&lt;/span&gt; == &lt;span class="literal"&gt;"ふー"&lt;/span&gt; )
        {
            &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;FooObject&lt;/span&gt;();
        }
        &lt;span class="keyword"&gt;else&lt;/span&gt;
        {
            &lt;span class="keyword"&gt;throw&lt;/span&gt; &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;ArgumentException&lt;/span&gt;();
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;SimpleFactory&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt; &lt;span class="id"&gt;CreateObject&lt;/span&gt;(&lt;span class="keyword"&gt;ByVal&lt;/span&gt; &lt;span class="id"&gt;objectName&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;) &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt;

        &lt;span class="keyword"&gt;If&lt;/span&gt; &lt;span class="id"&gt;objectName&lt;/span&gt; = &lt;span class="literal"&gt;"ほげ"&lt;/span&gt; &lt;span class="keyword"&gt;Then&lt;/span&gt;

            &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;HogeObject&lt;/span&gt;()

        &lt;span class="keyword"&gt;ElseIf&lt;/span&gt; &lt;span class="id"&gt;objectName&lt;/span&gt; = &lt;span class="literal"&gt;"ふー"&lt;/span&gt; &lt;span class="keyword"&gt;Then&lt;/span&gt;

            &lt;span class="keyword"&gt;Return&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;FooObject&lt;/span&gt;()

        &lt;span class="keyword"&gt;Else&lt;/span&gt;

            &lt;span class="keyword"&gt;Throw&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;ArgumentException&lt;/span&gt;()

        &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;If&lt;/span&gt;

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Function&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;li&gt;3.のFactoryを使用するクラスを定義します。 
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;Program&lt;/span&gt;
{
    &lt;span class="keyword"&gt;private&lt;/span&gt; &lt;span class="keyword"&gt;static&lt;/span&gt; &lt;span class="id"&gt;SimpleFactory&lt;/span&gt; &lt;span class="id"&gt;_simpleFactory&lt;/span&gt; = &lt;span class="keyword"&gt;new&lt;/span&gt; &lt;span class="id"&gt;SimpleFactory&lt;/span&gt;();

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;static&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Main&lt;/span&gt;(&lt;span class="keyword"&gt;string&lt;/span&gt;[] &lt;span class="id"&gt;args&lt;/span&gt;)
    {
        &lt;span class="id"&gt;IObject&lt;/span&gt; &lt;span class="id"&gt;obj&lt;/span&gt;;

        &lt;span class="id"&gt;obj&lt;/span&gt; = &lt;span class="id"&gt;_simpleFactory&lt;/span&gt;.&lt;span class="id"&gt;CreateHoge&lt;/span&gt;(&lt;span class="literal"&gt;"ほげ"&lt;/span&gt;);

        &lt;span class="id"&gt;obj&lt;/span&gt;.&lt;span class="id"&gt;Output&lt;/span&gt;();

        &lt;span class="id"&gt;obj&lt;/span&gt; = &lt;span class="id"&gt;_simpleFactory&lt;/span&gt;.&lt;span class="id"&gt;CreateHoge&lt;/span&gt;(&lt;span class="literal"&gt;"ふー"&lt;/span&gt;);

        &lt;span class="id"&gt;obj&lt;/span&gt;.&lt;span class="id"&gt;Output&lt;/span&gt;();

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;ReadLine&lt;/span&gt;();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;Program&lt;/span&gt;

    &lt;span class="keyword"&gt;Private&lt;/span&gt; &lt;span class="keyword"&gt;Shared&lt;/span&gt; &lt;span class="id"&gt;_simpleFactory&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;New&lt;/span&gt; &lt;span class="id"&gt;SimpleFactory&lt;/span&gt;()

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Shared&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Main&lt;/span&gt;(&lt;span class="keyword"&gt;ByVal&lt;/span&gt; &lt;span class="id"&gt;args&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="keyword"&gt;String&lt;/span&gt;())

        &lt;span class="keyword"&gt;Dim&lt;/span&gt; &lt;span class="id"&gt;obj&lt;/span&gt; &lt;span class="keyword"&gt;As&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt;

        &lt;span class="id"&gt;obj&lt;/span&gt; = &lt;span class="id"&gt;_simpleFactory&lt;/span&gt;.&lt;span class="id"&gt;CreateObject&lt;/span&gt;(&lt;span class="literal"&gt;"ほげ"&lt;/span&gt;)

        &lt;span class="id"&gt;obj&lt;/span&gt;.&lt;span class="id"&gt;Output&lt;/span&gt;()

        &lt;span class="id"&gt;obj&lt;/span&gt; = &lt;span class="id"&gt;_simpleFactory&lt;/span&gt;.&lt;span class="id"&gt;CreateObject&lt;/span&gt;(&lt;span class="literal"&gt;"ふー"&lt;/span&gt;)

        &lt;span class="id"&gt;obj&lt;/span&gt;.&lt;span class="id"&gt;Output&lt;/span&gt;()

        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;ReadLine&lt;/span&gt;()

    &lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt;

&lt;span class="keyword"&gt;End&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;h4&gt;実行結果&lt;/h4&gt;&lt;pre class="code" style="margin-top: 0.5em"&gt;ほげ
ふー&lt;/pre&gt;
&lt;p&gt;こんな感じです。&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;んで、どこが利点かといいますと、仮に「ほげ」、「ふー」の他に「ばー」を追加しようとしたとしましょう。&lt;/p&gt;
&lt;h5 class="cs-header"&gt;C# Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="id"&gt;BarObject&lt;/span&gt; : &lt;span class="id"&gt;IObject&lt;/span&gt;
{
    &lt;span class="preprocessor"&gt;#region&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt; &lt;span class="id"&gt;メンバ&lt;/span&gt;

    &lt;span class="keyword"&gt;public&lt;/span&gt; &lt;span class="keyword"&gt;void&lt;/span&gt; &lt;span class="id"&gt;Output&lt;/span&gt;()
    {
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span class="id"&gt;WriteLine&lt;/span&gt;(&lt;span class="literal"&gt;"ふー"&lt;/span&gt;);
    }

    &lt;span class="preprocessor"&gt;#endregion&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h5 class="vb-header"&gt;VB Code&lt;/h5&gt;&lt;pre class="code"&gt;&lt;code&gt;&lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Class&lt;/span&gt; &lt;span class="id"&gt;BarObject&lt;/span&gt;
    &lt;span class="keyword"&gt;Implements&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt;

    &lt;span class="keyword"&gt;Public&lt;/span&gt; &lt;span class="keyword"&gt;Sub&lt;/span&gt; &lt;span class="id"&gt;Output&lt;/span&gt;() &lt;span class="keyword"&gt;Implements&lt;/span&gt; &lt;span class="id"&gt;IObject&lt;/span&gt;.&lt;span class="id"&gt;Output&lt;/span&gt;
        &lt;span class="id"&gt;Console&lt;/span&gt;.&lt;span cla