質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

Q&A

解決済

1回答

1808閲覧

FactoryMethodパターンについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

0グッド

2クリップ

投稿2016/12/04 09:42

JavaのFactoryMethodパターンについての質問です。
こちらのサイトを参考にしています。
https://www.ogis-ri.co.jp/otc/hiroba/technical/DesignPatternsWithExample/chapter04.html

説明]

「基本構造はこの通りなのですが、この Factory Method パターンはシンプルなデザインパターンであり、活用方法にいろいろなバリエーションがあります。そのため、Factory Method パターンの適用例として目にするものには少し違った形式のものがあるでしょう。( 補足 A) 今回取り上げた例に関係するものを少し挙げると、以下のようなものがあります。

  • Factory クラスが単独 (サブクラス化なし) で存在し、ファクトリメソッドがスタティックメソッドではないもの
  • 抽象ファクトリクラスに getFactory() のようなメソッドを保持し、その中で具象ファクトリクラスを生成し、抽象ファクトリ型で返却するようなもの
  • ファクトリクラスを抽出せず、ファクトリメソッドの追加のみ行うもの

FactoryMethodパターンの最も基本的なものについては理解しているのですが、上二つ(「ファクトリメソッドがstaticでないもの」と「抽象ファクトリクラスにgetFactory()のようなメソッドを保持し、その中で具象ファクトリクラスを生成し、抽象ファクトリ型で返却するようなもの」)がイメージできません。
どのようにして、実装するのでしょうか?
なお、基本構造(図で示したようなクラス図になるような場合)だと実装が参考として示したサイトに載っていました。
上二つについて何かアイディアや考えがある方は是非とも教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

たいやきを作るとします。

java

1class Taiyaki { 2 3 final String filling; 4 5 Taiyaki(String filling) { 6 this.filling = filling; 7 } 8 9 @Override 10 public String toString() { 11 return filling + "の入ったたいやきだよ!"; 12 } 13}

ファクトリを作りましょう。

java

1abstract class TaiyakiFactory { 2 abstract Taiyaki getTaiyaki(); 3} 4 5class AnkoTaiyakiFactory extends TaiyakiFactory { 6 @Override 7 Taiyaki getTaiyaki() { 8 return new Taiyaki("あんこ"); 9 } 10} 11 12class CreamTaiyakiFactory extends TaiyakiFactory { 13 @Override 14 Taiyaki getTaiyaki() { 15 return new Taiyaki("クリーム"); 16 } 17} 18

それぞれのファクトリでそれぞれのたいやきがいっぱい作れます。

java

1// あんこのファクトリ 2TaiyakiFactory factory1 = new AnkoTaiyakiFactory(); 3 4// クリームのファクトリ 5TaiyakiFactory factory2 = new CreamTaiyakiFactory(); 6 7System.out.println(factory1.getTaiyaki()); 8System.out.println(factory2.getTaiyaki()); 9System.out.println(factory1.getTaiyaki()); 10System.out.println(factory2.getTaiyaki());
あんこの入ったたいやきだよ! クリームの入ったたいやきだよ! あんこの入ったたいやきだよ! クリームの入ったたいやきだよ!

先に後者の「抽象ファクトリクラスに getFactory() のようなメソッドを保持し、その中で具象ファクトリクラスを生成し、抽象ファクトリ型で返却するようなもの 」ですが、

java

1abstract class TaiyakiFactory { 2 3 abstract Taiyaki getTaiyaki(); 4 5 static TaiyakiFactory getFactory(String filling) { 6 7 if ("あんこ".equals(filling)) { 8 return new AnkoTaiyakiFactory(); 9 } else if ("クリーム".equals(filling)) { 10 return new CreamTaiyakiFactory(); 11 } else { 12 throw new IllegalArgumentException("そんな具はないです"); 13 } 14 } 15}

こうすると、呼び出し側でファクトリの実装クラスを知らなくてもよいことになります。
つまり、どのファクトリを使うかの判断をファクトリ側に寄せることができます。

java

1// あんこのファクトリ 2TaiyakiFactory factory1 = TaiyakiFactory.getFactory("あんこ"); 3 4// クリームのファクトリ 5TaiyakiFactory factory2 = TaiyakiFactory.getFactory("クリーム"); 6 7System.out.println(factory1.getTaiyaki()); 8System.out.println(factory2.getTaiyaki()); 9System.out.println(factory1.getTaiyaki()); 10System.out.println(factory2.getTaiyaki());
あんこの入ったたいやきだよ! クリームの入ったたいやきだよ! あんこの入ったたいやきだよ! クリームの入ったたいやきだよ!

次に「Factory クラスが単独 (サブクラス化なし) で存在し、ファクトリメソッドがスタティックメソッドではないもの 」ですが、

java

1class TaiyakiFactory { 2 3 final String filling; 4 5 TaiyakiFactory(String filling) { 6 this.filling = filling; 7 } 8 9 Taiyaki getTaiyaki() { 10 return new Taiyaki(filling); 11 } 12}

こうすると、ファクトリクラスのサブクラスは不要になりますが、
ファクトリ自体がパラメタを持っているので、それぞれのファクトリから生成されるインスタンスを別のものにすることができます。

java

1// あんこのファクトリ 2TaiyakiFactory factory1 = new TaiyakiFactory("あんこ"); 3 4// クリームのファクトリ 5TaiyakiFactory factory2 = new TaiyakiFactory("クリーム"); 6 7System.out.println(factory1.getTaiyaki()); 8System.out.println(factory2.getTaiyaki()); 9System.out.println(factory1.getTaiyaki()); 10System.out.println(factory2.getTaiyaki());
あんこの入ったたいやきだよ! クリームの入ったたいやきだよ! あんこの入ったたいやきだよ! クリームの入ったたいやきだよ!

どんな風にファクトリを作るのが良いかは場合によるかと思うので、
いろいろな方法があるよ程度に覚えておけばよいかと。

投稿2016/12/04 13:10

nyago_d

総合スコア178

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/12/06 03:41

回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問