1.定義
オブジェクトの定義を作成するために接口
、その子类
クラスのどのインスタンスを決定します。そのサブクラスを遅らせるために、クラスをインスタンス化するために、工場の製造方法。
2、例えば
あるAnimal
ポートが2つのクラスがあり、Dog
およびCat
インタフェースを継承しています。私たちは、と呼ばれるAnimalDactory
ファクトリクラスのインタフェースを、次に定義DogFactory
とCatFactory
クラスそれぞれ、作成するために、Dog
そしてCat
オブジェクトを作成するために、どの植物を決定するために発呼端末によって、インスタンス。
3、コード
// 创建 动物 接口
public interface Animal {
void sayName();
}
// 创建 猫和狗 类
public class Cat implements Animal {
@Override
public void sayName() {
System.out.println("我是猫!");
}
}
public class Dog implements Animal {
@Override
public void sayName() {
System.out.println("我是狗!");
}
}
// 创建工厂接口类
public interface IAnimalFactory {
Animal createAnimal();
}
// 分别创建生成猫和狗 的工厂类
public class CatFactory implements IAnimalFactory{
@Override
public Animal createAnimal() {
return new Cat();
}
}
public class DogFactory implements IAnimalFactory{
@Override
public Animal createAnimal() {
return new Dog();
}
}
// 客户端使用工厂类来创建动物对象
public class Main {
public static void main(String[] args) {
// 分别获得生产猫和狗的工厂类
IAnimalFactory catFacroty = new CatFactory();
IAnimalFactory dogFacroty = new DogFactory();
Animal cat = catFacroty.createAnimal();
Animal dog = dogFacroty.createAnimal();
cat.sayName();
dog.sayName();
}
}
ここでは、操作の結果は次のとおりです。
我是猫!
我是狗!
4、利点
工場へのパターン简单工厂模式
と工厂方法模式
。ファクトリメソッドは、インターフェイスを持っていないだろう、と植物の複数のインスタンスを作成することができ、一般的に静的であり、以下のように、:简单方法模式
// 简单工厂模式的工厂
public class AnimalFactory implements IAnimalFactory{
@Override
public Animal createAnimal(String name) {
// 通过 if 判断,生成多中不同的实例
if("cat".equals(name)){
return new Cat();
}
if("dog".equals(name)){
return new Dog();
}
throw new RuntimeException("无此类动物:" + name);
}
}
ファクトリインタフェースがあり、異なるインスタンスに対して、ファクトリクラスを複数有しています。工厂方法模式
私たちはここを参照してください、見つける简单工厂模式
よりも工厂方法模式
(これ以上ファクトリクラスが存在しないので)、それはより簡潔に。しかし、中に简单工厂模
式、ファクトリクラスは、我々は新しい動物のクラスを追加したい場合、あなたは我々がそうすることを、工場出荷時のクラスのメソッドを変更する必要があり、決定ロジックが含まれていない唯一のオープンも修正のために開いて展開する、に反しオープン-クローズ原則。あなたが使用している場合や工厂方法
モードを、我々は唯一の新工場は、元のコードを変更することなく、機能拡張を実現することができるようになります追加する必要があります。
基本的には、これら2つのモデルが判断される問題が存在します。简单工厂模式
、ファクトリメソッドにロジックを決定することです工厂方法模式
ファクトリクラスへの使用を決定するために、発呼端末で、決定ロジックの端にコールを入れて、あなたは新しい機能を追加したい場合は、むしろファクトリクラスよりも、回線のコールの終了を変更するだけの必要性。
5、アプリケーションのシナリオ
- クラスのファクトリモードシールド内部の詳細を呼び出して、クラス間の結合を低減するために作成されます。
- プロセスは、効果的にシステムの複雑さを軽減することができますクラスファクトリを使用して、より複雑なクラスを作成する場合。
- Abstract Factoryパターンのフレームワークに依存している、それは良いスケーラビリティを持ちます。