|
Rarestyleへようこそ
|
|
|
|
|
|
デザインパターンでキャリアアップ
|
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
{
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();
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("いちごショートケーキ");
}
}
class Class1
{
[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 実行結果
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 |
|
|
大阪府 大阪 - 明日の天気
|
雨
-
|
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
|
大阪府 大阪 - あさっての天気
|
曇時々晴
-
|
|
|
最高
|
最低
|
| 気温
|
7 |
3 |
| 湿度
|
44.6 |
37.4 |
|
|
|
|
取得日:2012/02/05 17:00:00
ST:
True |
|
| livedoorのWebサービスより提供 |
|
【工事中】お天気配信 ユーザー登録 |
|
|
|
|
|
Internet Explorer5.0以上のご利用を推奨いたします。
|
 |
Copyright 2006 Rarestyle
このページへのリンクは確認不要です。
Programming by Xenon Project Team
postmaster@rarestyle.net
免責事項について
|