ホームページ >Java >&#&チュートリアル >Java の単純なファクトリー パターン

Java の単純なファクトリー パターン

高洛峰
高洛峰オリジナル
2016-12-15 14:08:431700ブラウズ

Java の単純な工場パターンをすぐに理解するために 2 つの例を挙げます:

ヌワは土から人を作りました
「世界が開かれたとき、人がいなかったので、ヌワは土から人を作りました。」ということわざがあります。土から人を作る必要がありましたが、女媧が人間を創造する前は​​、人間という概念は女媧の思考の中にのみ存在していました。
Nuwa は人間を作成します。これは単純な工場モデルの応用です。

まず、人間を創造するというこの考えには、いくつかの重要な役割があります。女媧自身、人間の抽象的な概念、そして女媧によって創造された具体的な人間です。
1.) Nuwa はファクトリークラスであり、シンプルなファクトリーモデルの中核となる役割を果たします。

2.) 張三、李斯などを含む古秀の人々のそれぞれ。これらの人々は、単純な工場モデルにおける特定の製品の役割です
3.) 抽象的な人々は、最初はヌワの心の中にのみ存在したアイデアです。このアイデアに従ってヌワによって作成された特定の人々はすべて、人間のこの抽象的な定義に準拠しています。言い換えれば、この抽象的な概念は、すべての特定の人々が持たなければならないインターフェイス (機能または機能) を規定しています
UML のクラス図は以下に示されています:

Java の単純なファクトリー パターン

上記のことを理解してから、次の例を理解してください, 比較理解,この記事を読むと、Java のシンプルなファクトリー モデルがよく理解できると思います。


さまざまな果物を市場に販売することを専門とする農場会社があります。このシステムでは、次の果物を記述する必要があります。 :
ブドウブドウ
イチゴ
リンゴ
の果実は他の植物とは異なり、最終的には摘んで食べることができるため、他の植物と区別するために、あらゆる種類の果物に適用できるインターフェースを構築するのが自然なアプローチです。 farm,

Java の単純なファクトリー パターン

この時点で、フルーツ クラスのインターフェイスが宣言されており、コードに反映されています:

    public   interface  Fruit {
        // 生长 
          void  grow();
         // 收获 
          void  harvest();
         // 种植 
          void  plant();
   }

フルーツ インターフェイスは、メソッド plant() およびグローを含む、すべてのフルーツが実装する必要があるインターフェイスを規定します。 () はフルーツ クラスに必ず必要です。そして、harvest();

Apple クラスはフルーツ クラスの一種であるため、フルーツ インターフェイスで宣言されたすべてのメソッドを実装します。さらに、リンゴは多年生植物であるため、リンゴの木の樹齢を表す追加のtreeAgeプロパティがあります。コードは次のとおりです:

package  fac;

 public   class  Apple  implements  Fruit { // 通过implements实现接口Fruit 
      private   int  treeAge;
    
     public   void  grow() {
        log( " Apple is growing " );
    } 
    
     public   void  harvest() {
        log( " Apple has been harvested " );
    } 
    
     public   void  plant() {
        log( " Apple ha been planted " );
    } 
    
     public   static   void  log(String msg) {
        System.out.println(msg);
    } 
    
     public   int  getTreeAge() {
         return  treeAge;
    } 
    
     public   void  setTreeAge( int  treeAge) {
         this .treeAge = treeAge;
    } 
}

同様に、ブドウ:

package fac;

public class Grape implements Fruit{
    private boolean seedless;
    public void grow(){
        log("Grape is growing.");
    }
    
    public void harvest(){
        log("Grape has been harvested");
    }
    
    public void plant(){
        log("Grape ha been planted");
    }
    
    public static void log(String msg){
        System.out.println(msg);
    }

    public boolean isSeedless() {
        return seedless;
    }

    public void setSeedless(boolean seedless) {
        this.seedless = seedless;
    }
    

}


イチゴ スチュワーベリー:

package fac;

public class Strawberry implements Fruit{
    public void grow(){
        log("Strawberry is growing");
    }
    
    public void harvest(){
        log("Strawberry has been harvested");
    }
    
    public void plant(){
        log("Strawberry has been planted");
    }
    
    public static void log(String msg){
        System.out.println(msg);
    }
}



ファーム ガーデナーもシステムの一部であり、クラス FruitGardener クラスで表されます。コードは次のとおりです。

package fac;

public class FruitGardener{
    public static Fruit factory(String which)throws Exception{
        if(which.equalsIgnoreCase("apple")){
            return new Apple();
        }else if(which.equalsIgnoreCase("strawberry")){
            return new Strawberry();
        }else if (which.equalsIgnoreCase("grape")){
            return new Grape();
        }else{
            throw new Exception("Bad fruit request");
        }
    }
}

この時、誰かが果樹園に来て、庭師に「あなたの果物について教えてください」と言いました。したがって、庭師は次のようになります:

package fac;

public class People {

    public static void main(String[] args) throws Exception {
        FruitGardener fg=new FruitGardener();
        Fruit ap=fg.factory("Apple");
        ap.grow();
        Fruit gp=fg.factory("Grape");
        gp.plant();
        
        Fruit dd=fg.factory("ddd");//抛出Bad fruit request异常
    }    

}

(注: 上記のコードは JDK5.0、Myeclise3.2 でコンパイルされ、渡されます)

2 つの例から類推すると、庭師は Nuwa と同等であり、果物も同等です。特定の人物にとってのインターフェイスフルーツは、ヌワの思考の中に存在する抽象的な人々の概念に相当します。

上記の 2 つの例から、単純なファクトリ パターンは次の役割で構成される必要があると結論付けることができます:
Interface
int ] 3番目の例:
注意してください次の 3 つの例の違いを比較するには
例 1:

package org.jzkangta.factorydemo01;
//定义接口
interface Car{
    public void run();
    public void stop();
}
//具体实现类
class Benz implements Car{
    public void run(){
        System.out.println("Benz开始启动了。。。。。");
    }
    public void stop(){
        System.out.println("Benz停车了。。。。。");
    }
}
//具体实现类
class Ford implements Car{
    public void run(){
        System.out.println("Ford开始启动了。。。");
    }
    public void stop(){
        System.out.println("Ford停车了。。。。");
    }
}
//工厂
class Factory{
    public static Car getCarInstance(){
        return new Ford();
    }
}
public class FactoryDemo01 {

    public static void main(String[] args) {
        Car c=Factory.getCarInstance();
        c.run();
        c.stop();

    }

}

例 2:
package fac;


//定义接口
interface Car{
    public void run();
    public void stop();
}
//具体实现类
class Benz implements Car{
    public void run(){
        System.out.println("Benz开始启动了。。。。。");
    }
    public void stop(){
        System.out.println("Benz停车了。。。。。");
    }
}

class Ford implements Car{
    public void run(){
        System.out.println("Ford开始启动了。。。");
    }
    public void stop(){
        System.out.println("Ford停车了。。。。");
    }
}
//工厂
class Factory{
    public static Car getCarInstance(String type){
        Car c=null;
        if("Benz".equals(type)){
            c=new Benz();
        }
        if("Ford".equals(type)){
            c=new Ford();
        }
        return c;
    }
}


public class FactoryDemo02 {

    public static void main(String[] args) {
        Car c=Factory.getCarInstance("Benz");
        if(c!=null){
            c.run();
            c.stop();
        }else{
            System.out.println("造不了这种汽车。。。");
        }
        

    }

}

例 3:

interface Car{
    public void run();
    public void stop();
}

class Benz implements Car{
    public void run(){
        System.out.println("Benz开始启动了。。。。。");
    }
    public void stop(){
        System.out.println("Benz停车了。。。。。");
    }
}

class Ford implements Car{
    public void run(){
        System.out.println("Ford开始启动了。。。");
    }
    public void stop(){
        System.out.println("Ford停车了。。。。");
    }
}

class Toyota implements Car{
    public void run(){
        System.out.println("Toyota开始启动了。。。");
    }
    public void stop(){
        System.out.println("Toyota停车了。。。。");
    }
}

class Factory{
    public static Car getCarInstance(String type){
        Car c=null;
        try {
            c=(Car)Class.forName("org.jzkangta.factorydemo03."+type).newInstance();//利用反射得到汽车类型 
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        return c;
    }
}
public class FactoryDemo03 {

    public static void main(String[] args) {
        Car c=Factory.getCarInstance("Toyota");
        if(c!=null){
            c.run();
            c.stop();
        }else{
            System.out.println("造不了这种汽车。。。");
        }
        

    }

}

3 つの例を比較してください:

例 1. 単純なファクトリーが実装されていますが、それぞれの場合、一度に 1 種類の車しか取得できません。別の種類に変更したい場合は、工場を変更する必要があり、あまりにも不便です。ただし、例 2 では、必要に応じて車を変更できるようにこの状況を変更します。ただし、置き換えるものは、実装内に存在する必要があります。新しい車を追加したい場合は、依然としてファクトリーを変更する必要がありますが、例 3 ではリフレクション メカニズムを使用して車のタイプを取得するため、新しい車を追加する必要がありません。ファクトリを変更しますが、実装するクラスを追加するだけで済みます。つまり、任意の種類の車を追加したい場合は、工場を変更せずに車のクラスを追加するだけで済みます。これにより工場分離の効果が得られます。



Java の単純なファクトリー パターンに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。