Rarestyleへようこそ
C#,デザインパターン,UML,オブジェクト指向,Webサービス,iPAQ(モバイル) アクセス数: Number_0Number_0Number_5Number_4Number_0Number_9Number_9Number_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ページ
インデント イベント&デジタルファッション
インデント ごあいさつ・免責情報
インデント お問い合わせ
デザインパターンでキャリアアップ

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

AbstractFactoryパターン 導入

AbstractFactoryMethodパターンは、FactoryMethodパターンより抽象度が一段高いパターンです。

FactoryMethodでは、個々の部品に対する考え方はあっても、部品群というまとまりに対する観念がありません。部品群に対する考えを導入するにあたり、Factory(工場)に対する考え方も拡張しなければなりません。Factoryでは部品群の組み合わせによる生成も要求されるのです。

部品群に対して、共通のインターフェースを用意します。(AbstractProduct)また工場群として、部品生成に対する(個々の部品群組み合わせなどに対応するためなど)インターフェースも用意します。(AbstractFactory)

AbstractFactoryMethodパターン ポイント

クライアントのアクセスに注目します。
部品群に対して抽象クラス(AbstractProduct)のインターフェースでもってアクセスします。
また、Factoryについてもその抽象クラスであるAbstractFactoryへのアクセスを利用します。
こういった操作でもって生成される部品群をまとめて切り替えることが可能となります。

UML AbstractFactoryMethodパターン

C#ソースコード

Sample.cs

using System;

namespace AbstractFactory
{
   //-------------------------------------------------------
   //  デザインパターン (Abstract Factory)
   //  AbstractFactoryパターンはFactoryMethodパターンより
   //  抽象度が1レベル高いデザインパターンです
   //  互いに関連したり依存したりするオブジェクト群をその具象クラス
   //  を明確にせずに生成するためのインターフェースを提供する
   //
   //-------------------------------------------------------

   //抽象部品A(カフェ)
   //部品のインターフェースを定義します。
   //クライアントは「抽象部品のインターフェースを通じて」
   //具象部品の操作をします。(ポイント①)
   public abstract class Product_Cafe
   {
       private string strProductName;
       public string ProductName
       {
           set{this.strProductName=value;}
           get{return this.strProductName;}
       }
   }

   //具象部品(Coffee)
   public class ConcreteProduct_Coffee : Product_Cafe
   {
       public ConcreteProduct_Coffee(string strProductName)
       {
           base.ProductName=strProductName;
       }
   }
   //具象部品(Cake)
   public class ConcreteProduct_Cake : Product_Cafe
   {
       public ConcreteProduct_Cake(string strProductName)
       {
           base.ProductName=strProductName;
       }
   }

   //抽象部品B(レストラン)
   //部品のインターフェースを定義します。
   //クライアントは「抽象部品のインターフェースを通じて」
   //具象部品の操作をします。(ポイント①)
   public abstract class Product_Restaulant
   {
       private string strProductName;
       public string ProductName
       {
           set{this.strProductName=value;}
           get{return this.strProductName;}
       }
   }

   //具象部品(Lunch)
   public class ConcreteProduct_Lunch : Product_Restaulant
   {
       public ConcreteProduct_Lunch(string strProductName)
       {
           base.ProductName=strProductName;
       }
   }
   //具象部品(Drink)
   public class ConcreteProduct_Drink : Product_Restaulant
   {
       public ConcreteProduct_Drink(string strProductName)
       {
           base.ProductName=strProductName;
       }
   }


   //抽象工場
   //「クライアントは」抽象工場のメソッドを利用することで
   //商品群の切り替えが可能となります。さらにこのメソッドを利用する
   //ことで派生クラスを直接利用するよりも関係が疎になります。
   public abstract class AbstractFactory
   {
       public abstract Product_Cafe        CreateProductA();
       public abstract Product_Restaulant  CreateProductB();


       //ここで実際の具象工場の生成を制御します。
       public static AbstractFactory GetFactory(string strConcreteFactoryName)
       {
           if(strConcreteFactoryName=="Kissa")
           {
               return new ConcreteFactory_Kissa();
           }
           else if(strConcreteFactoryName=="FirstFood")
           {
               return new ConcreteFactory_FirstFood();
           }
           return null;
       }
   }

   //具象工場はサブクラス(この場合は具象部品)のインスタンスの生成を専門
   //に引き受けます。

   //具象工場(喫茶店)コーヒーとランチを出します。
   //具象工場は必要な部品のインスタンスを生成します。(ポイント②)
   public class ConcreteFactory_Kissa : AbstractFactory
   {
       public override Product_Cafe CreateProductA()
       {
           return new ConcreteProduct_Coffee("キリマンジャロ");
       }
       public override Product_Restaulant CreateProductB()
       {
           return new ConcreteProduct_Lunch("パスタナポリタン");
       }
   }

   //具象工場(ファーストフード店)お菓子ーと飲み物を出します。
   public class ConcreteFactory_FirstFood : AbstractFactory
   {
       public override Product_Cafe CreateProductA()
       {
           return new ConcreteProduct_Cake("チーズケーキ");
       }
       public override Product_Restaulant CreateProductB()
       {
           return new ConcreteProduct_Drink("オレンジジュース");
       }
   }


   /// <summary>
   /// Class1 の概要の説明です。
   /// </summary>
   class Class1
   {
       /// <summary>
       /// アプリケーションのメイン エントリ ポイントです。
       /// </summary>
       [STAThread]
       static void Main(string[] args)
       {

           //喫茶店メニュを生成
           AbstractFactory factory = AbstractFactory.GetFactory("Kissa");
           //クライアントは抽象工場のメソッドを実行します。
           Product_Cafe        PA = factory.CreateProductA();
           Product_Restaulant  PB = factory.CreateProductB();
           //クライアントは抽象部品のメソッド(この場合はプロパティですが)を実行します
           Console.WriteLine(PA.ProductName);
           Console.WriteLine(PB.ProductName);

           //------------------------------------------------------------------
           //1)抽象インターフェースを通じて部品にアクセスする。
           //      クライアントは具象部品の操作に、抽象部品のインターフェースを使用し
           //      ます。このことは、商品郡内で別の商品に切り替えてもクライアントの
           //      変更がおこらないことを意味します。
           //2)オブジェクトの生成責務を特定のクラスに局所化
           //      クライアントは具象工場の抽象工場を利用することにより、依存関係を
           //      疎に保つと同時に、生成される商品群をまとめて切り替えることも可能と
           //      なります。
           //---------------------------------------------------------------------

           //---------------------------------------------------------------------
           //  結論 ペアで使うクラスがあらかじめわかっている場合で、且つ
           //          組み合わせて使うクラスが多い場合、派生クラスの生成をまとめて
           //          引き受けるクラスを設けるパターンであるといえますね。
           //
           //---------------------------------------------------------------------
       }
   }
}

AbstractFactory 実行結果

abstractfactory_fig

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

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

AbstractFactory.java
   1: package abstractFactroy;
   2: 
   3: public abstract class AbstractFactory {
   4: 
   5:     public abstract Product_Restaulant CreateProductB();
   6: 
   7:     public abstract Product_Cafe CreateProductA();
   8: 
   9:     static AbstractFactory getFactory(String strConcreteFactoryName) {
  10:         //具象工場の生成を制御します。
  11:         if (strConcreteFactoryName.equals("Kissa")){
  12:             //具象工場(喫茶を生成します)
  13:             return new ConcreteFactory_Kissa();
  14:         }else if(strConcreteFactoryName.equals("FirstFood")){
  15:             //具象工場(ファーストフードを生成します)
  16:             return new ConcreteFactory_FirstFood();    
  17:         }
  18:         return null;
  19:     }
  20: 
  21: }
ConcreteFactory_FirstFood.java
   1: package abstractFactroy;
   2: 
   3: //具象工場ファーストフードではCakeとDrinkを作成します。
   4: public class ConcreteFactory_FirstFood extends AbstractFactory {
   5: 
   6:     public Product_Cafe CreateProductA() {
   7:         return new ConcreteProduct_Cake("チーズケーキ");
   8:     }
   9: 
  10:     public Product_Restaulant CreateProductB() {
  11:         return new ConcreteProduct_Drink("オレンジジュース");
  12:     }
  13: 
  14: }
ConcreteFactory_Kissa.java
   1: package abstractFactroy;
   2: 
   3: //具象工場喫茶ではCoffeeとLunchを作成します。
   4: public class ConcreteFactory_Kissa extends AbstractFactory {
   5: 
   6:     public Product_Cafe CreateProductA() {
   7:         //カフェインスタンスの生成
   8:         return new ConcreteProduct_Coffee("キリマンジャロ");
   9:     }
  10: 
  11:     public Product_Restaulant CreateProductB() {
  12:         //レストランインスタンスの生成
  13:         return new ConcreteProduct_Lunch("パスタナポリタン");
  14:     }
  15: 
  16: }
ConcreteProduct_Cake.java
   1: package abstractFactroy;
   2: 
   3: public class ConcreteProduct_Cake extends Product_Cafe {
   4: //    具象部品の商品名はコンストラクタでセットします。
   5:     public ConcreteProduct_Cake(String productName) {
   6:         super.setProductName(productName);
   7:     }
   8: 
   9: }
ConcreteProduct_Coffee.java
   1: package abstractFactroy;
   2: 
   3: public class ConcreteProduct_Coffee extends Product_Cafe {
   4:     //    具象部品の商品名はコンストラクタでセットします。
   5:     public ConcreteProduct_Coffee(String productName) {
   6:         super.setProductName(productName);
   7:     }
   8: 
   9: }
ConcreteProduct_Drink.java
   1: package abstractFactroy;
   2: 
   3: public class ConcreteProduct_Drink extends Product_Restaulant {
   4:     //具象部品の商品名はコンストラクタでセットします。
   5:     public ConcreteProduct_Drink(String productName) {
   6:         super.setProductName(productName);
   7:     }
   8: 
   9: }
ConcreteProduct_Lunch.java
   1: package abstractFactroy;
   2: 
   3: public class ConcreteProduct_Lunch extends Product_Restaulant {
   4:     //    具象部品の商品名はコンストラクタでセットします。
   5:     public ConcreteProduct_Lunch(String productName) {
   6:         super.setProductName(productName);
   7:     }
   8: 
   9: }
Product_Cafe.java
   1: package abstractFactroy;
   2: 
   3: public abstract class Product_Cafe {
   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: }
Product_Restaulant.java
   1: package abstractFactroy;
   2: 
   3: public abstract class Product_Restaulant {
   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: }
StartClass.java
   1: package abstractFactroy;
   2: 
   3: public class StartClass {
   4: 
   5:     public static void main(String[] args) {
   6:         //喫茶工場インスタンスを参照する。
   7:         AbstractFactory factory = AbstractFactory.getFactory("Kissa");
   8:         //喫茶工場では生成するものがすでに定義されています。
   9:         Product_Cafe         pa =factory.CreateProductA();
  10:         Product_Restaulant     pb =factory.CreateProductB();
  11:         //商品確認
  12:         System.out.println(pa.getProductName());
  13:         System.out.println(pb.getProductName());
  14:     }
  15: }



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

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

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