工場設計パターンとは?
ファクトリ (またはファクトリ メソッド) 設計パターンは、委譲とカプセル化に特化しています。このパターンにより、スーパークラスはインスタンス化をサブクラスに任せることができます。これは、プライマリ ファクトリ メソッド パターンを含むクラスが抽象クラスであるためです。
ファクトリ メソッドの元のバージョンは、作成される製品がわからないため、実装されていないメソッドの形式を想定しています。ファクトリ メソッドは、何らかの製品を作成していることを認識している可能性がありますが、作成する製品の特定の特性は認識していません。この知識は、それぞれのサブクラスのみが利用できます。したがって、ファクトリ メソッドを実装して適切なオブジェクトを作成する責任は、サブクラスだけにあります。
Java で Factory Design パターンを実装する
この記事では、サンプルのフィードバック レポート生成アプリケーションを使用します。このアプリケーションは、企業が (新しいスナックについて) 受け取るさまざまな種類のフィードバックを使用して、特定のレポートを作成します (ファクトリ メソッドを使用)。したがって、ファクトリ パターンは、次の主要な製品クラスをベースとして使用して、特定のフィードバック (またはフィードバック レポート) を作成します。
public abstract class Feedback {
private String reviewerName;
private String reviewMessage;
private int reviewRatings;
public Feedback(String reviewerName, String reviewMessage, int reviewRatings) {
this.reviewerName = reviewerName;
this.reviewMessage = reviewMessage;
this.reviewRatings = reviewRatings;
}
public String getReviewerName() {
return reviewerName;
}
public void setReviewerName(String reviewerName) {
this.reviewerName = reviewerName;
}
public String getReviewMessage() {
return reviewMessage;
}
public void setReviewMessage(String reviewMessage) {
this.reviewMessage = reviewMessage;
}
public int getReviewRatings() {
return reviewRatings;
}
public void setReviewRatings(int reviewRatings) {
this.reviewRatings = reviewRatings;
}
}
すべてのフィードバックには、レビュー担当者の名前、レビュー メッセージ、新しいスナックの評価数 (1 ~ 5) の 3 つの必須プロパティがあります。会社が受け取るさまざまな種類のフィードバックは、次の 3 つのチャネルのいずれかから提供されます。
電子メール フィードバック クラス
public class EmailFeedback extends Feedback {
private String reviewerEmail;
public EmailFeedback(String reviewerName, String reviewMessage, int reviewRatings, String reviewerEmail) {
super(reviewerName, reviewMessage, reviewRatings);
this.reviewerEmail = reviewerEmail;
}
public String getReviewerEmail() {
return reviewerEmail;
}
public void setReviewerEmail(String reviewerEmail) {
this.reviewerEmail = reviewerEmail;
}
}
メール フィードバック クラス
public class MailFeedback extends Feedback {
private String returnAddress;
public MailFeedback(String reviewerName, String reviewMessage, int reviewRatings, String returnAddress) {
super(reviewerName, reviewMessage, reviewRatings);
this.returnAddress = returnAddress;
}
public String getReturnAddress() {
return returnAddress;
}
public void setReturnAddress(String returnAddress) {
this.returnAddress = returnAddress;
}
}
ソーシャル メディア フィードバック クラス
public class SocialMediaFeedback extends Feedback {
private String reviewerHandle;
public SocialMediaFeedback(String reviewerName, String reviewMessage, int reviewRatings, String reviewerHandle) {
super(reviewerName, reviewMessage, reviewRatings);
this.reviewerHandle = reviewerHandle;
}
public String getReviewerHandle() {
return reviewerHandle;
}
public void setReviewerHandle(String reviewerHandle) {
this.reviewerHandle = reviewerHandle;
}
}
各フィードバック サブクラスには固有のプロパティがあることがわかります。つまり、フィードバックの種類ごとに、その種類に固有のプロパティを少なくとも 1 つ使用してレポートを作成する必要があります。
シンプルファクトリー
シンプルなファクトリは、ファクトリ デザイン パターンを使用する一般的なアプローチです。このアプローチでは、すべての異なるフィードバック (または製品) をメソッド (単純なファクトリ) にグループ化し、パラメーターに基づいて適切なフィードバックを選択する必要があります。
public class FeedbackReportFactory {
public Feedback makeFeedback(String feedbackType) {
Feedback feedback = null;
if(feedbackType.equals("email")) {
feedback = new EmailFeedback();
}else if (feedbackType.equals("mail")) {
feedback = new MailFeedback();
}else if (feedbackType.equals("social")) {
feedback = new SocialMediaFeedback();
}
return feedback;
}
}
ただし、シンプル ファクトリ アプローチは、ファクトリ デザイン パターンではなく、デザイン パターンでもありません。それはデザインコンセプトのようなものです。
工場方式
ファクトリ メソッドは、設計パターンの真の表現です。ファクトリ メソッドを使用して、改良されたFeedbackReportFactory Java クラスに次のコードが含まれるようになりました。
public abstract class FeedbackReportFactory {
public abstract void makeFeedbackReport(Feedback feedback);
}
次のクラス ダイアグラムを使用して、ファクトリ デザイン パターンの構造を定義できます。
上の図から、抽象クラス (またはインターフェース) にファクトリ メソッドの抽象バージョンが含まれていることがわかります。したがって、抽象クラスを拡張する具体的なファクトリ クラスは、作成する製品に固有のプロパティを使用して、ファクトリ メソッドを実装します。また、具象ファクトリ クラスは 1 つ以上の製品を作成する必要があることにも注意してください。
サンプル アプリケーションには、関連するが固有の製品が 3 つあります。各フィードバック タイプには、少なくとも 1 つの一意のプロパティがあります。そのため、アプリケーションには、各製品を構築するために 3 つのコンクリート ファクトリが必要になります。
メール フィードバック ファクトリー
public class EmailFeedbackReport extends FeedbackReportFactory{
EmailFeedback feedback;
@Override
public void makeFeedbackReport(Feedback feedback) {
this.feedback = (EmailFeedback) feedback;
System.out.println("\nReport For Feedback Via Email"+
"\nReviewer Name: " +this.feedback.getReviewerName() +
"\nFeedback: " + this.feedback.getReviewMessage() +
"\nRatings: " + this.feedback.getReviewRatings() +
"\nEmal Address: " + this.feedback.getReviewerEmail());
}
}
メール フィードバック ファクトリー
public class MailFeedbackReport extends FeedbackReportFactory {
MailFeedback feedback;
@Override
public void makeFeedbackReport(Feedback feedback) {
this.feedback = (MailFeedback) feedback;
System.out.println("\nReport For Feedback Via Mail"+
"\nReviewer Name: " +this.feedback.getReviewerName() +
"\nFeedback: " + this.feedback.getReviewMessage() +
"\nRatings: " + this.feedback.getReviewRatings() +
"\nMailing Address: " + this.feedback.getReturnAddress());
}
}
ソーシャル メディア フィードバック ファクトリー
public class SocialMediaFeedbackReport extends FeedbackReportFactory {
SocialMediaFeedback feedback;
@Override
public void makeFeedbackReport(Feedback feedback) {
this.feedback = (SocialMediaFeedback) feedback;
System.out.println("\nReport For Feedback Via Social Media"+
"\nReviewer Name: " + this.feedback.getReviewerName() +
"\nFeedback: " + this.feedback.getReviewMessage() +
"\nRatings: " + this.feedback.getReviewRatings() +
"\nReviewer Social Media Handle: " + this.feedback.getReviewerHandle());
}
}
サンプル アプリケーションのテスト
これで、それぞれのファクトリ メソッドを使用して、さまざまなチャネルから受け取ったフィードバックに関するミニチュア レポートを作成できます。JUnit を使用してアプリケーションをテストするか、ドライバー クラスを作成できます。
public class Main {
public static void main(String[] args) {
Feedback feedback = new EmailFeedback("Nick", "Great product!", 5, "nick@email.com");
Feedback feedback2 = new MailFeedback("john", "The product is good but not something I would buy regularly", 4, "first Street");
Feedback feedback3 = new SocialMediaFeedback("Jane", "It's not for me", 2, "@janey");
FeedbackReportFactory factory = new EmailFeedbackReport();
FeedbackReportFactory factory2 = new MailFeedbackReport();
FeedbackReportFactory factory3 = new SocialMediaFeedbackReport();
factory.makeFeedbackReport(feedback);
factory2.makeFeedbackReport(feedback2);
factory3.makeFeedbackReport(feedback3);
}
上記の Main クラスは、それぞれのファクトリを使用して 3 つのレポートを作成し、コンソールに次の出力を生成します。
Factory Design パターンを使用する利点
ファクトリ デザイン パターンは、具体的なクラスを作成するためにインターフェイス (または抽象クラス) を使用する設計の柔軟性を促進します。また、アプリケーションの拡張に合わせて新しいクラスが既存のインターフェイスを実装できるようにすることで、ポリモーフィズムによるスケーラビリティも促進します。
ファクトリ デザイン パターンを使用するときは、2 つの重要な設計原則を利用しています。Open-Closed と Inversion of Control (IoC) です。
コメントを残す