|
Rarestyleへようこそ
|
|
|
|
|
|
デザインパターンでキャリアアップ |
AbstractFactoryMethodパターン (デザインパターン)
AbstractFactoryパターン 導入
AbstractFactoryMethodパターンは、FactoryMethodパターンより抽象度が一段高いパターンです。
FactoryMethodでは、個々の部品に対する考え方はあっても、部品群というまとまりに対する観念がありません。部品群に対する考えを導入するにあたり、Factory(工場)に対する考え方も拡張しなければなりません。Factoryでは部品群の組み合わせによる生成も要求されるのです。
部品群に対して、共通のインターフェースを用意します。(AbstractProduct)また工場群として、部品生成に対する(個々の部品群組み合わせなどに対応するためなど)インターフェースも用意します。(AbstractFactory)
AbstractFactoryMethodパターン ポイント
クライアントのアクセスに注目します。
部品群に対して抽象クラス(AbstractProduct)のインターフェースでもってアクセスします。
また、Factoryについてもその抽象クラスであるAbstractFactoryへのアクセスを利用します。
こういった操作でもって生成される部品群をまとめて切り替えることが可能となります。
UML AbstractFactoryMethodパターン
C#ソースコード
|
Sample.cs
|
|
using System;
namespace AbstractFactory
{
public abstract
class Product_Cafe
{
private
string strProductName;
public
string ProductName
{
set{this.strProductName=value;}
get{return this.strProductName;}
}
}
public class
ConcreteProduct_Coffee : Product_Cafe
{
public ConcreteProduct_Coffee(string strProductName)
{
base.ProductName=strProductName;
}
}
public class
ConcreteProduct_Cake : Product_Cafe
{
public ConcreteProduct_Cake(string strProductName)
{
base.ProductName=strProductName;
}
}
public abstract
class Product_Restaulant
{
private
string strProductName;
public
string ProductName
{
set{this.strProductName=value;}
get{return this.strProductName;}
}
}
public class
ConcreteProduct_Lunch : Product_Restaulant
{
public ConcreteProduct_Lunch(string strProductName)
{
base.ProductName=strProductName;
}
}
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("オレンジジュース");
}
}
class Class1
{
[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);
}
}
}
|
AbstractFactory 実行結果
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へもどる
|
|
| お天気情報 |
|
東京都 東京 - 今日の天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
東京都 東京 - 明日の天気
|
晴時々曇
-
|
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
東京都 東京 - あさっての天気
|
曇時々晴
-
|
|
|
最高
|
最低
|
| 気温
|
34 |
27 |
| 湿度
|
93.2 |
80.6 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
大阪府 大阪 - 今日の天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
大阪府 大阪 - 明日の天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
|
大阪府 大阪 - あさっての天気
|
晴時々曇
-
|
|
|
最高
|
最低
|
| 気温
|
36 |
28 |
| 湿度
|
96.8 |
82.4 |
|
|
|
|
取得日:2010/09/03 17:00:00
ST:
True |
|
| livedoorのWebサービスより提供 |
|
【工事中】お天気配信 ユーザー登録 |
|
|
|
|
|
Internet Explorer5.0以上のご利用を推奨いたします。
|
 |
Copyright 2006 Rarestyle
このページへのリンクは確認不要です。
Programming by Xenon Project Team
postmaster@rarestyle.net
免責事項について
|