ファクトリメソッド
単純なファクトリモードとの違いは、ファクトリメソッドもファクトリクラスをインターフェイス(抽象クラス)に抽象化し、各製品には対応する独自のファクトリクラスがあることです。
単純なファクトリモデルについては前に説明しましたが、新製品iphone13をリリースする場合にコードを変更する必要があることを想像してみてください。
1)まず、Appleインターフェイスを実装するために新しい携帯電話製品クラスIphone13を作成する必要があります
2)ファクトリクラスのコードを変更し、新しい携帯電話のロジックコードを追加します。
ここで引用したコードは非常に単純ですが、実際のプロジェクトでは非常に複雑な(ディープレベルの)構造になっています。したがって、ファクトリクラスのコードを変更するのは非常に面倒です。
現時点ではファクトリーモデルはこちら!それが来るの!ファクトリクラスをインターフェイスとして定義し、新しい製品が追加されるたびにAppleインターフェイスを実装し、対応するファクトリクラスを作成してファクトリインターフェイスを実装します。この設計は、元のコードを変更せずに拡張できます。綺麗な。
/**
* 苹果系列
*/
public interface Apple {
}
public class Iphone12 implements Apple {
}
public class Iphone11 implements Apple {
}
public class Iphone10 implements Apple {
}
ファクトリクラス:
/**
* 工厂类
*/
public interface AppleFactory {
public Apple createPhone();
}
public class Iphone12Factory implements AppleFactory {
public Apple createPhone(){
return new Iphone12();
}
}
public class Iphone11Factory implements AppleFactory {
public Apple createPhone(){
return new Iphone11();
}
}
public class Iphone10Factory implements AppleFactory {
public Apple createPhone(){
return new Iphone10();
}
}
顧客クラス:
public class Consumer {
public static void main(String[] args) {
Factory iphone12Factory = new Iphone12Factory();
Apple iphone12 = iphone12Factory.createPhone();
//这里我们需要什么产品类,用对应工厂类的createPhone()方法即可
Factory iphone11Factory = new Iphone11Factory();
Apple iphone11 = iphone11Factory.createPhone();
}
}
最初に説明しますが、どのデザインパターンが必ずしも最適であるかではありません。使用するモードは、実際のプロジェクトによって異なります。
ファクトリモデルは拡張性が高いですが、新しい製品カテゴリのソースコードを変更する必要はありませんが、製品カテゴリが多い場合は、ファクトリカテゴリが多数表示されます。単純なファクトリパターンとファクトリメソッドパターンの組み合わせを考えることができます。
拡張(より良いファクトリーモデル)
上記のファクトリーモデルを読んだ後、別のモデルを見てみましょう。これを読んだ後は、ファクトリーモデルについての理解が深まると思います。
商品カテゴリー:上記と同じ(省略)
ファクトリクラス:
/**
* 工厂类
*/
public abstract AppleFactory {
public abstract Apple createPhone();
public void doSomething(){
Apple iphone = createPhone();
//I have to do something
}
}
public class Iphone12Factory implements AppleFactory {
public Apple createPhone(){
return new Iphone12();
}
}
public class Iphone11Factory implements AppleFactory {
public Apple createPhone(){
return new Iphone11();
}
}
public class Iphone10Factory implements AppleFactory {
public Apple createPhone(){
return new Iphone10();
}
}
顧客カテゴリ:
public class Consumer {
public static void main(String[] args) {
Factory iphone12Factory = new Iphone12Factory();
iphone12Factory.doSomething();
}
}
ファクトリパターンは設計上のアイデアであり、ファクトリの親クラスがインターフェイスであるか抽象クラスであるかを制限しないことがわかります。それはあなたがそれをどのように達成するかだけを気にします(工場モデルは各製品が工場に対応するということです)。
実際、これら2つの実装の間に大きな違いはありません。後者は、製品オブジェクトを直接返すのではなく、このオブジェクトを使用して何かを実行します。栗をあげましょう。電話がかかってきたらすぐに他の人にあげますが、他の人は気にしません。現時点では、doSomething()は他の人に与えることです。