Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_1Number_3Number_9Number_3Number_0Number_8Number_9
インデント OCPとデザインパターン
インデント サンプルコードについて
インデント デザインパターン ひとくちメモ
インデント FactoryMethodパターン
インデント AbstractFactoryパターン
インデント Builderパターン
インデント Prototypeパターン
インデント Adapterパターン
インデント Bridgeパターン
インデント Compositeパターン
インデント Decoratorパターン
インデント Facadeパターン
インデント Flyweightパターン
インデント Proxyパターン
インデント TemplateMethodパターン
インデント Chain of Responsibilityパターン
インデント Commandパターン
インデント Iteratorパターン
インデント Mediatorパターン
インデント Mementoパターン
インデント Observerパターン
インデント Stateパターン
インデント Strategyパターン
インデント Visitorパターン
インデント 速習!デザインパターン第一回
インデント 速習!デザインパターン第二回
インデント 速習!デザインパターン第三回
インデント UMLとは
インデント UML入門
インデント オブジェクト指向
インデント クラス図
インデント アクティビティ図
インデント インタラクション図
インデント ユースケース図
インデント Rarestyle証明書サービス
インデント QRコード発行WSDL
インデント QRコード発行サンプル
インデント J2EE覚書
インデント FreeMind実践レポート
インデント モバイル情報
インデント Homeページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

FactoryMethodパターン (デザインパターン)

FactoryMethodパターン 導入

FactoryMethodはインスタンスの生成を派生クラスに任せます。

人が物を作成するという事例で考えて見ます。実際に出来上がる物をケーキー、お寿司としてすれば、この2つは 製品(Product) という枠でまとめることができます(製品の抽象化)。
そして、この抽象化された製品からの派生物として、具象製品(ケーキやお寿司)が定義できます。
次に人はについて考えます。今回は、職人(Creator)という枠で考えてますが、この職人というレベル段階では、生成するものはまだ決めることができません。 しかし、職人は、物(この場合Product)を作るという操作(メソッド)は定義しておきます。 ケーキ職人、寿司職人といったもの(具象製作者)は、この職人(Creator)クラスを継承した派生クラスで定義します。(製作者の抽象化)
実際の物(製品)=(ConcreteProducts)を生成するのは、職人を継承した派生クラス(ConcreteCreator)が担当します。 FactoryMethodパターンは、製作者(具象製作者)に実際の製品(具象製品)の生成を任せます。

FactoryMethodパターン

人[Creator](抽象)

製作者[ConcreteCreator](具象)

物[Product](抽象)

製品[ConcreteProduct](具象)

人(抽象)は、FactoryMethod()というメソッドで製品を作ります。
製作者には、必ずFactoryMethodを実装します。
この時点で何を作るか製品が決定していませんので メソッド定義はできません。

[抽象定義]
FactoryMethod() 戻り値は:製品 製作者(具象)

[具象定義]
FactoryMethod() 戻り値は:製品 [Point]
戻り値には実際の製品のインスタンスの参照がセット されるようにします。

Product prd =new ConcreteProduct(); あるいは、
ConcreteProduct prd =new ConcreteProduct();

物(抽象) 製品共通のメソッド、プロパティなどを定義すると良いでしょう。
製品(具象) 具体的な製品の操作などを定義。

補足説明
製作者での生成物はきまっており、固有のインスタンスの生成を防ぐことにもつながっていきます。
(ケーキ職人がお寿司を作成するというようなことがおこらない)
製作者のメソッドFactoryMethod()で、製作者固有の製品(ConcreteProducgts)を生成します。
製作者は、必ず製品を生成するようにすることから、親クラスである人ににFactoryMethod()を抽象定義します。

FactoryMethodパターン ポイント

FactoryMethodでは、製品のインターフェース(Product)とそれを生成するためのメソッド(CreatorのFactoryMethod)を知っていれば実際のオブジェクトを入手し利用することが出来ます。
また、物が人を作ることはありません。つまり具象製作者(ConcreteCreator)は具象商品(ConcreteProducts) に対して依存関係が生じます。

UML FactoryMethodパターン

C#ソースコード FactoryMethodパターン

Sample.cs

using System;

namespace FactoryMethod
{

   //--------------------------------------------------------------
   //  デザインパターン Factory Method
   //
   //  インスタンス生成をサブクラスに任せる。
   //
   //--------------------------------------------------------------

   public abstract class Product
   {
       private string strProductName;
       public string ProductName
       {
           set{this.strProductName=value;}
           get{return this.strProductName;}
       }
   }

   public class ConcreteProduct_Susi : Product
   {
       public ConcreteProduct_Susi(string strProductName)
       {
           base.ProductName=strProductName;
       }
   }

   public class ConcreteProduct_Cake : Product
   {
       public ConcreteProduct_Cake(string strProductName)
       {
           base.ProductName=strProductName;
       }
   }

   public abstract class Creator
   {
       //実際にどんなインスタンスを生成するかは
       //サブクラスに委ねる。(ここがポイント!!)
       public abstract Product FactoryMethod();

       //Crator共通のメソッドを記述
       //このメソッド例は、Creatorの派生インスタンスが
       //生成する製品操作などについての振る舞いを記述するのが一般的です。
       public void anOperation()
       {
           Product Prod    =this.FactoryMethod();
           Console.WriteLine(Prod.ProductName + "を作りました");
       }
   }

   public class ConcreteCreator_Susi : Creator
   {
       public override Product FactoryMethod()
       {
           return new ConcreteProduct_Susi("まき寿司");
       }
   }

   public class ConcreteCreator_Cake : Creator
   {
       public override Product FactoryMethod()
       {
           return new ConcreteProduct_Cake("いちごショートケーキ");
       }
   }

   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {
           //寿司職人
           ConcreteCreator_Susi Susi_Syokunin =new ConcreteCreator_Susi();
           //ケーキ職人
           ConcreteCreator_Cake Cake_Syokunin =new ConcreteCreator_Cake();

           //寿司職人の操作
           Susi_Syokunin.anOperation();
           //ケーキ職人の操作
           Cake_Syokunin.anOperation();

           //オブジェクトを生成するためには、そのオブジェクトの型を
           //知っている必要があります。FactoryMethodでは、
           //製品を生成するのは、Creatorの派生クラスの役割です。
           //上記の場合、寿司職人は、寿司のクラスを生成し、ケーキ職人は
           //ケーキを生成します。寿司職人がケーキーを生成するといったように
           //誤ったインスタンスを生成することはありません。

           //内容は、ただのオーバーライドじゃん!!
       }
   }
}

FactoryMethod 実行結果

factorymethod_fig

UMLプラグインによる描画 FactoryMethodパターン

Javaソースコード FactoryMethodパターン

Creator.java
   1: package factoryMethod;
   2: 
   3: public abstract class Creator {
   4: 
   5:     //ここで生成される具象製品を取得します。
   6:     abstract Product factoryMethod();
   7: 
   8:     //Createクラスのサブクラスが生成する製品についての
   9:     //操作、取得などを記述します。
  10:     void anOperation() {
  11:         Product product =this.factoryMethod();
  12:         System.out.println(product.getProductName()+"を作りました");
  13:     }
  14: 
  15: }
ConcreteCreator_Cake.java
   1: package factoryMethod;
   2: 
   3: public class ConcreteCreator_Cake extends Creator {
   4: 
   5:     //具象生産者のfactoryMethodは製品を生成することです
   6:     Product factoryMethod() {
   7:         return new ConcreteProduct_Cake("いちごショートケーキ");
   8:     }
   9: 
  10: }
ConcreteCreator_Susi.java
   1: package factoryMethod;
   2: 
   3: public class ConcreteCreator_Susi extends Creator {
   4: 
   5:     //具象生産者のfactoryMethodは製品を生成することです
   6:     Product factoryMethod() {
   7:         return new ConcreteProduct_Susi("巻き寿司");
   8:     }
   9: 
  10: }
Product.java
   1: package factoryMethod;
   2: 
   3: public abstract class Product {
   4: 
   5:     private String ProductName;
   6: 
   7:     public String getProductName() {
   8:         return ProductName;
   9:     }
  10: 
  11:     public void setProductName(String ProductName) {
  12:         this.ProductName = ProductName;
  13:     }
  14: 
  15: }
ConcreteProduct_Cake.java
   1: package factoryMethod;
   2: 
   3: public class ConcreteProduct_Cake extends Product {
   4:     
   5:     //ProductNameはコンストラクタでセットします。
   6:     public ConcreteProduct_Cake(String strProductName){
   7:         super.setProductName(strProductName);
   8:     }
   9: 
  10: }
ConcreteProduct_Drink.java
   1: package factoryMethod;
   2: 
   3: public class ConcreteProduct_Susi extends Product {
   4:     
   5:         //ProductNameはコンストラクタでセットします。
   6:         public ConcreteProduct_Susi(String strProductName){
   7:             super.setProductName(strProductName);
   8:       }
   9: 
  10: }
StartClass.java
   1: package factoryMethod;
   2: 
   3: public class StartClass {
   4:     public static void main(String[] args) {
   5:     
   6:         //寿司職人
   7:         ConcreteCreator_Susi Susi_Syokunin = new ConcreteCreator_Susi();
   8:         //ケーキ職人
   9:         ConcreteCreator_Cake Cake_Syokunin = new ConcreteCreator_Cake();
  10:         
  11:         //寿司職人の操作
  12:         Susi_Syokunin.anOperation();
  13:         //ケーキ職人の操作
  14:         Cake_Syokunin.anOperation();
  15:     }
  16: }

コミュニティマーカーデザインパターン「ひとくちメモ」へ

コミュニティマーカーHomeへもどる

お天気情報
東京都 東京 - 今日の天気
曇り - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - 明日の天気
晴のち雨 - リンク先
最高 最低
気温 9 3
湿度 48.2 37.4
取得日:2012/02/05 17:00:00  ST: True
東京都 東京 - あさっての天気
晴時々曇 - リンク先
最高 最低
気温 11 4
湿度 51.8 39.2
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 今日の天気
晴のち曇 - リンク先
最高 最低
気温 - -
湿度 - -
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - 明日の天気
- リンク先
最高 最低
気温 11 5
湿度 51.8 41
取得日:2012/02/05 17:00:00  ST: True
大阪府 大阪 - あさっての天気
曇時々晴 - リンク先
最高 最低
気温 7 3
湿度 44.6 37.4
取得日:2012/02/05 17:00:00  ST: True
livedoorのWebサービスより提供
【工事中】お天気配信 ユーザー登録
rarestyle
Copyright 2006 Rarestyle このページへのリンクは確認不要です。
Programming by Xenon Project Team     postmaster@rarestyle.net
免責事項について
レアスタイルサイト内検索