GeeksforGeeks (日本語)
これは、オブジェクトの作成について説明する作成デザインパターンです。ファクトリデザインパターンは、インターフェイス(Javaインターフェイスまたは抽象クラス)を定義し、サブクラスにインスタンス化するオブジェクトを決定させることを示しています。インターフェイスのファクトリメソッドを使用すると、クラスはインスタンス化を1つ以上の具象サブクラスに延期できます。このデザインパターンはオブジェクトのインスタンス化について説明しているため、作成デザインパターンのカテゴリに分類されます。 Factoryメソッドという名前に気付いた場合、それはファクトリであるメソッドがあることを意味し、一般にファクトリは作成作業に関与しており、これを使用してオブジェクトが作成されています。これは、オブジェクト作成ロジックがクライアントに隠されているオブジェクトを作成するための最良の方法の1つです。それでは、実装を見てみましょう。
実装:
1。インターフェイス内でファクトリメソッドを定義します。
2。サブクラスに上記のファクトリメソッドを実装させ、作成するオブジェクトを決定させます。
Javaでは、コンストラクターはポリモーフィックではありませんが、サブクラスがオブジェクトを作成できるようにすることで、インスタンス化にポリモーフィックな動作を追加しています。つまり、サブクラスに何を作成するかを決定させることで疑似ポリモーフィズムを実現しようとしているため、このFactoryメソッドは
仮想コンストラクターとも呼ばれます。リアルタイムの問題といくつかのコーディング演習を使用して実装してみましょう。
問題の説明:
電子メール、SMS、およびプッシュ通知を介した通知サービスを実装することを検討してください。ファクトリメソッドデザインパターンを使用して、これを実装してみましょう。まず、このためのUMLクラス図を設計します。
上記のクラス図には、Notificationというインターフェイスがあり、3つの具体的なクラスがNotificationインターフェイスを実装しています。ファクトリクラスNotificationFactoryは、Notificationオブジェクトを取得するために作成されます。それでは、コーディングに取り掛かりましょう。
通知インターフェースの作成
public
interface
Notification {
void
notifyUser();
}
注-上記のインターフェースは、抽象クラスとして作成することもできます。
すべての実装クラスを作成する
SMSNotification.java
public
class
SMSNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending an SMS notification"
);
}
}
EmailNotification.java
public
class
EmailNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending an e-mail notification"
);
}
}
PushNotification.java
public
class
PushNotification
implements
Notification {
@Override
public
void
notifyUser()
{
System.out.println(
"Sending a push notification"
);
}
}
ファクトリクラスNotificationFactory.javaを作成して、具象クラスをインスタンス化します。
次に、ファクトリクラスを使用して、いくつかの情報を渡すことにより、具象クラスのオブジェクトを作成および取得しましょう。
public
class
NotificationService {
public
static
void
main(String args)
{
NotificationFactory notificationFactory =
new
NotificationFactory();
Notification notification = notificationFactory.createNotification(
"SMS"
);
notification.notifyUser();
}
}
Output : Sending an SMS notification
リアルタイムの例
このデザインパターンは、
1などのJDKで広く使用されています。 java.util.Calendar、NumberFormat、およびResourceBundleのgetInstance()メソッドは、ファクトリメソッドデザインパターンを使用します。
2。 JavaのInteger、Booleanなどのすべてのラッパークラスは、このパターンを使用して、valueOf()メソッドを使用して値を評価します。
3。 java.nio.charset.Charset.forName()、java.sql.DriverManager#getConnection()、java.net.URL.openConnection()、java.lang.Class.newInstance()、java.lang.Class。forName()は、ファクトリメソッドデザインパターンが使用された例の一部です。
結論
これまで、ファクトリメソッドデザインパターンとは何か、およびその実装方法を学習しました。 これで、この設計メカニズムの利点を正しく理解できたと思います。