Javaのファクトリーパターンとは何ですか

爱喝马黛茶的安东尼
リリース: 2019-11-12 17:16:22
オリジナル
3158 人が閲覧しました

Javaのファクトリーパターンとは何ですか

#ファクトリ メソッド パターン

ファクトリ メソッド パターンは 3 つのタイプに分かれています:

1通常のファクトリ モードでは、ファクトリ クラスを確立して、同じインターフェイスを実装するいくつかのクラスのインスタンスを作成します。まず、関係図を見てください:

例は次のとおりです: (電子メールとテキスト メッセージを送信する例を示します)

まず、2 つの間の共通インターフェイスを作成します:

public interface Sender {  
    public void Send();  
}
ログイン後にコピー
ログイン後にコピー

次に、実装クラスを作成します:

public class MailSender implements Sender {  
    @Override  
    public void Send() {  
        System.out.println("this is mailsender!");  
    }  
}
ログイン後にコピー
ログイン後にコピー
public class SmsSender implements Sender {  
  
    @Override  
    public void Send() {  
        System.out.println("this is sms sender!");  
    }  
}
ログイン後にコピー
ログイン後にコピー

最後に、ファクトリ クラスを構築します:

public class SendFactory {  
  
    public Sender produce(String type) {  
        if ("mail".equals(type)) {  
            return new MailSender();  
        } else if ("sms".equals(type)) {  
            return new SmsSender();  
        } else {  
            System.out.println("请输入正确的类型!");  
            return null;  
        }  
    }  
}
ログイン後にコピー

テストしてみましょう:

public class FactoryTest {  
  
    public static void main(String[] args) {  
        SendFactory factory = new SendFactory();  
        Sender sender = factory.produce("sms");  
        sender.Send();  
    }  
}
ログイン後にコピー

出力:

this is sms sender!
ログイン後にコピー

2. 複数ファクトリ メソッド パターンは通常のファクトリ メソッド パターンを改良したもので、通常のファクトリ メソッド パターンでは渡した文字列が間違っているとオブジェクトを正しく作成できませんでしたが、複数ファクトリ メソッド パターンでは複数のファクトリを提供します。オブジェクトを個別に作成するメソッド。関係図:

public class SendFactory {  
   public Sender produceMail(){  
        return new MailSender();  
    }  
      
    public Sender produceSms(){  
        return new SmsSender();  
    }  
}
ログイン後にコピー
# 上記のコードを変更し、SendFactory クラスを次のように変更します:

public class FactoryTest {  
  
    public static void main(String[] args) {  
        SendFactory factory = new SendFactory();  
        Sender sender = factory.produceMail();  
        sender.Send();  
    }  
}
ログイン後にコピー

テスト クラスは次のとおりです:

this is mailsender!
ログイン後にコピー
ログイン後にコピー

出力:

public class SendFactory {  
      
    public static Sender produceMail(){  
        return new MailSender();  
    }  
      
    public static Sender produceSms(){  
        return new SmsSender();  
    }  
}
ログイン後にコピー

3. 静的ファクトリ メソッド モード. 上記の複数のファクトリ メソッド モードのメソッドを静的にします。インスタンスを作成する必要はなく、直接呼び出すだけです。

public class FactoryTest {  
  
    public static void main(String[] args) {      
        Sender sender = SendFactory.produceMail();  
        sender.Send();  
    }  
}
ログイン後にコピー
this is mailsender!
ログイン後にコピー
ログイン後にコピー

出力:

public interface Sender {  
    public void Send();  
}
ログイン後にコピー
ログイン後にコピー

一般的に言えば、ファクトリ パターンが適しています。作成する必要のある製品が多数あり、共通のインターフェイスを持つ場合は常に、それらの製品はファクトリメソッドパターン。上記 3 つのモードのうち、1 つ目のモードは入力文字列が間違っているとオブジェクトを正しく作成できませんが、3 つ目のモードは 2 つ目のモードに比べてファクトリ クラスをインスタンス化する必要がないため、ほとんどの場合は 3 つ目のモードを選択します。 - 静的なファクトリ メソッド パターン。

4. 抽象ファクトリ パターン

ファクトリ メソッド パターンに関する 1 つの問題は、クラスの作成がファクトリ クラスに依存していることです。ファクトリ クラスを変更する必要があります。変更を行うことはクロージャ原則に違反します。したがって、設計の観点から見ると、特定の問題があります。それらを解決するにはどうすればよいですか?抽象ファクトリ パターンを使用して複数のファクトリ クラスを作成するだけで、新しい関数を追加する必要がある場合は、前のコードを変更せずに新しいファクトリ クラスを直接追加できます。抽象的なファクトリーは理解するのが難しいため、最初に図を見てからコードを見ると理解しやすくなります。

例を参照してください:

public class MailSender implements Sender {  
    @Override  
    public void Send() {  
        System.out.println("this is mailsender!");  
    }  
}
ログイン後にコピー
ログイン後にコピー

2 つの実装クラス:

public class SmsSender implements Sender {  
  
    @Override  
    public void Send() {  
        System.out.println("this is sms sender!");  
    }  
}
ログイン後にコピー
ログイン後にコピー
public class SendMailFactory implements Provider {  
      
    @Override  
    public Sender produce(){  
        return new MailSender();  
    }  
}
ログイン後にコピー

2 つのファクトリ クラス:

public class SendSmsFactory implements Provider{  
  
    @Override  
    public Sender produce() {  
        return new SmsSender();  
    }  
}
ログイン後にコピー
public interface Provider {  
    public Sender produce();  
}
ログイン後にコピー

インターフェイスの提供:

public class Test {  
  
    public static void main(String[] args) {  
        Provider provider = new SendMailFactory();  
        Sender sender = provider.produce();  
        sender.Send();  
    }  
}
ログイン後にコピー

Test クラス:

rrreee

実際、このモデルの利点は、リアルタイム情報を送信する機能を追加する場合、実装クラスを作成し、Sender インターフェイスを実装するだけで済むことです。ファクトリクラスも同時に作成しますので、Providerインターフェースを実装するだけでOKで、既存のコードを変更する必要はありません。このようにして、拡張性が向上します。

php 中国語 Web サイト、無料の

Java 入門チュートリアル

が多数あり、オンラインで学習することを歓迎します。

以上がJavaのファクトリーパターンとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート