まさるblog

越後在住子持ちプログラマー奮闘記 - Author:まさる(高野 将、TAKANO Sho)

目次

Blog 利用状況

ニュース

著書

2010/7発売


Web掲載記事

@IT

.NET開発を始めるVB6プログラマーが知るべき9のこと

CodeZine

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

第1回 3層データバインドを正しく活用しよう(前編)

ブログパーツ


書庫

日記カテゴリ

コミュニティ

デザインパターンを学ぶ~その14:Factoryパターン(1)~

Factory (ファクトリー)
 工場

Factoryパターンは、「工場」という名の通り、インスタンスを作り出すクラスを定義するパターンです。

このパターンを適用することにより、インスタンスの生成方法を気にすることなく使用することができるようになり、オブジェクト間の結合が"疎"になります。

まずはSimple Factoryからやっていきます。Simple Factoryは実際はデザインパターンではないそうですが、Factoryの簡単なイメージが得られると思います。

 

では、コードを示します。

  1. 具象クラスの元となるInterfaceを定義します。
    C# Code
    public interface IObject
    {
        void Output();
    }
    
    VB Code
    Public Interface IObject
    
        Sub Output()
    
    End Interface
    
  2. 1.のInterfaceを継承して具象クラスを定義します。
    C# Code
    public class HogeObject : IObject
    {
    
        #region IObject メンバ
    
        public void Output()
        {
            Console.WriteLine("ほげ");
        }
    
        #endregion
    }
    
    public class FooObject : IObject
    {
        #region IObject メンバ
    
        public void Output()
        {
            Console.WriteLine("ふー");
        }
    
        #endregion
    }
    
    VB Code
    Public Class HogeObject
        Implements IObject
    
        Public Sub Output() Implements IObject.Output
            Console.WriteLine("ほげ")
        End Sub
    
    End Class
    
    Public Class FooObject
        Implements IObject
    
        Public Sub Output() Implements IObject.Output
            Console.WriteLine("ふー")
        End Sub
    
    End Class
    
  3. 文字列を引数とし、その値によってインスタンスを生成する具象クラスを切り替えるFactoryクラスを定義します。
    C# Code
    public class SimpleFactory
    {
        public IObject CreateHoge(string objectName)
        {
            if ( objectName == "ほげ" )
            {
                return new HogeObject();
            }
            else if ( objectName == "ふー" )
            {
                return new FooObject();
            }
            else
            {
                throw new ArgumentException();
            }
        }
    }
    
    VB Code
    Public Class SimpleFactory
    
        Public Function CreateObject(ByVal objectName As String) As IObject
    
            If objectName = "ほげ" Then
    
                Return New HogeObject()
    
            ElseIf objectName = "ふー" Then
    
                Return New FooObject()
    
            Else
    
                Throw New ArgumentException()
    
            End If
    
        End Function
    
    End Class
    
  4. 3.のFactoryを使用するクラスを定義します。
    C# Code
    public class Program
    {
        private static SimpleFactory _simpleFactory = new SimpleFactory();
    
        public static void Main(string[] args)
        {
            IObject obj;
    
            obj = _simpleFactory.CreateHoge("ほげ");
    
            obj.Output();
    
            obj = _simpleFactory.CreateHoge("ふー");
    
            obj.Output();
    
            Console.ReadLine();
        }
    }
    
    VB Code
    Public Class Program
    
        Private Shared _simpleFactory As New SimpleFactory()
    
        Public Shared Sub Main(ByVal args As String())
    
            Dim obj As IObject
    
            obj = _simpleFactory.CreateObject("ほげ")
    
            obj.Output()
    
            obj = _simpleFactory.CreateObject("ふー")
    
            obj.Output()
    
            Console.ReadLine()
    
        End Sub
    
    End Class
    

実行結果

ほげ
ふー

こんな感じです。

 

んで、どこが利点かといいますと、仮に「ほげ」、「ふー」の他に「ばー」を追加しようとしたとしましょう。

C# Code
public class BarObject : IObject
{
    #region IObject メンバ

    public void Output()
    {
        Console.WriteLine("ばー");
    }

    #endregion
}
VB Code
Public Class BarObject
    Implements IObject

    Public Sub Output() Implements IObject.Output
        Console.WriteLine("ばー")
    End Sub

End Class

この際、Simple Factoryを用いている場合、Programクラスの変更は必要なく、SimpleFactoryクラスの変更だけで済みます。

C# Code
public class SimpleFactory
{
    public IObject CreateHoge(string objectName)
    {
        if ( objectName == "ほげ" )
        {
            return new HogeObject();
        }
        else if ( objectName == "ふー" )
        {
            return new FooObject();
        }
        else if ( objectName == "ばー" )    // ※追加した部分
        {
            return new BarObject();
        }
        else
        {
            throw new ArgumentException();
        }
    }
}
VB Code
Public Class SimpleFactory

    Public Function CreateObject(ByVal objectName As String) As IObject

        If objectName = "ほげ" Then

            Return New HogeObject()

        ElseIf objectName = "ふー" Then

            Return New FooObject()

        ElseIf objectName = "ばー" Then        ' ※追加した部分

            Return New BarObject()

        Else

            Throw New ArgumentException()

        End If

    End Function

End Class

つまり、「処理のメインとなるクラスに変更を及ぼさない」設計が可能となります。そして、これは今後エントリにするFactory Methodパターン、Abstract Factoryパターンにも共通する特徴です。

 

次回はFactory Methodパターンについてまとめます。

投稿日時 : 2007年8月28日 22:35

Feedback

# デザインパターンを学ぶ~その15:Factoryパターン(2)~ 2007/11/07 0:57 まさるblog

デザインパターンを学ぶ~その15:Factoryパターン(2)~

# デザインパターンを学ぶ~その17:Factoryパターン(4)~ 2008/05/31 22:23 まさるblog

デザインパターンを学ぶ~その17:Factoryパターン(4)~

# re: デザインパターンを学ぶ~その14:Factoryパターン(1)~ 2015/01/02 17:52 ふ~

訂正お詫び

『んで、どこが利点かといいますと、仮に「ほげ」、「ふー」の他に「ばー」を追加しようとしたとしましょう。』
の下説明

Console.WriteLine("ふー")

Console.WriteLine("ばー")

間違い

# re: デザインパターンを学ぶ~その14:Factoryパターン(1)~ 2015/01/08 12:24 まさる

こんな何年も前の記事に指摘ありがとうございます。

# Howdy! I know this is kinda off topic nevertheless I'd figured I'd ask. Would you be interested in exchanging links or maybe guest writing a blog article or vice-versa? My blog goes over a lot of the same topics as yours and I think we could greatly be 2019/05/04 16:05 Howdy! I know this is kinda off topic nevertheless

Howdy! I know this is kinda off topic nevertheless I'd figured I'd
ask. Would you be interested in exchanging links or maybe guest writing
a blog article or vice-versa? My blog goes
over a lot of the same topics as yours and I think we could greatly benefit from each other.

If you are interested feel free to send me an e-mail.
I look forward to hearing from you! Superb blog by
the way!

# I got this site from my buddy who informed me on the topic of this web site and now this time I am visiting this website and reading very informative posts at this time. natalielise plenty of fish 2019/08/02 11:40 I got this site from my buddy who informed me on

I got this site from my buddy who informed me
on the topic of this web site and now this time I am visiting this website and reading very informative posts at this time.
natalielise plenty of fish

# I am regular visitor, how are you everybody? This post posted at this web site is truly good. 2019/08/15 7:05 I am regular visitor, how are you everybody? This

I am regular visitor, how are you everybody? This post posted at this
web site is truly good.

# I am regular visitor, how are you everybody? This post posted at this web site is truly good. 2019/08/15 7:06 I am regular visitor, how are you everybody? This

I am regular visitor, how are you everybody? This post posted at this
web site is truly good.

# I am regular visitor, how are you everybody? This post posted at this web site is truly good. 2019/08/15 7:07 I am regular visitor, how are you everybody? This

I am regular visitor, how are you everybody? This post posted at this
web site is truly good.

# I am regular visitor, how are you everybody? This post posted at this web site is truly good. 2019/08/15 7:08 I am regular visitor, how are you everybody? This

I am regular visitor, how are you everybody? This post posted at this
web site is truly good.

タイトル  
名前  
Url
コメント