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

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

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

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

デザインパターン

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

Q&A

解決済

1回答

1526閲覧

FactoryMethodパターンの利点について

nasutaro211

総合スコア21

Java

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

デザインパターン

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

1グッド

1クリップ

投稿2018/06/26 23:03

FactoryMethodパターンがどういったものかについては理解したのですがその利点がわかりません。

次のようにパーツが定義されていて、

//Factory.java public abstract class Factory{ public abstract Product factoryMethod(); // abstract キーワードが必要 public final Product create(){ // 抽象クラスの中にメソッドを定義することもできる Product product = factoryMethod(); return product; } }
//Product.java public abstract class Product{ public abstract void method1(); public abstract void method2(); }
//ConcreteFactory.java public class ConcreteFactory extends Factory{ public Product factoryMethod(){ return new ConcreteProduct(); } }
//ConcreteProduct.java public class ConcreteProduct extends Product{ public void method1(){ System.out.println("method1"); } public void method2(){ System.out.println("method2"); } }

次のように使われていたところで疑問が生じました。

public class Client{ public static void main(String[] args){ Factory factory = new ConcreteFactory(); //本来ならFactoryクラスを継承したクラスがたくさんあってその中から一つ選んで生成するはず。(この考えが違うのか?) Product product = factory.factoryMethod();//なぜそのままnew ConcreteProduct()としない? /* 結局Factory側のインスタンスを条件に合わせて生成しているのだから意味がないのでは? 何らかの条件分岐によってその都度「どのFactoryを宣言するか」を決めないと機能しないならば、 何らかの条件分岐によってその都度「どのProductを生成するか(newするか)」を決めるのと同じではないか? */ product.method1(); product.method2(); } }

FactoryMethodパターンへの理解が浅いからこのような疑問が生じているのか、それとも他にこのFactoryMethodパターンが役に立つタイミングがあるのかわからないのですが、どうにもFactoryMethodの恩恵がわかりません。
FactoryMethodパターンを使ってその都度生成するFactoryを変えるのと、FactoryMethodパターンを使わずその都度生成するProductを変えるのがどう違うか。また、FactoryMethodパターンを使うのの何がいいのかがわからないのでご教授いただけると幸いです。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

何らかの条件分岐によってその都度「どのProductを生成するか(newするか)」を決めるのと同じではないか?

その「条件」を、Productを使う側のコードから追い出すことができます。

たとえば、最適化のために、動的に「簡単なProductと複雑なProductで実際に作るクラスを変える」となった場合も、FactoryProductだけ使う側では実際のクラスを全く気にしなくてよくてFactory側のコードを書き換えるだけで、実際のProductのクラスを違えることができます。

Javaの場合、newするにはクラスがコンパイル時点で決まっていないといけないので、こんな芸当はできません。

投稿2018/06/26 23:15

編集2018/06/26 23:19
maisumakun

総合スコア145183

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

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

nasutaro211

2018/06/27 01:42

つまりConcreteFactoryのfactoryMethodの中でswitch文などの条件を書いて、Productクラスを継承しているクラスのうちどれを返すかを決めるっていう形でしょうか? その場合FactoryクラスとProductクラスは一対一ではなく一対多になっているイメージで大丈夫でしょうか? そうだとしたら恩恵があるのが理解できます!
maisumakun

2018/06/27 01:43

はい、FactoryとProductの対応は1対1ではなく、多対多となっても全く問題ありません。
nasutaro211

2018/06/27 01:47

多対多になることもあるのですね! ありがとうございます。 利点がようやく理解できましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問