2017-04-08 7 views
0

Javaのプログラム上のJavaプログラムで二つのファクトリクラスは

enum FILE_TYPE { 
    XML, JSON; 
} 

interface Parser { 
    void parse(); 
} 
class XMLparser implements Parser { 
    public void parse() { } 
} 
class JSONparser implements Parser { 
    public void parse() { } 
} 

interface Mapper { 
    void map(); 
} 
class XMLmapper implements Mapper { 
    public void map() { } 
} 
class JSONmapper implements Mapper { 
    public void map() { } 
} 

class ParserFactory { 
    public static Parser getInstance(FILE_TYPE fileType) { 
     switch(fileType) { 
     case XML: 
      return new XMLparser(); 
     case JSON: 
      return new JSONparser(); 
     } 
     return null; 
    } 
} 

class MapperFactory { 
    public static Mapper getInstance(FILE_TYPE fileType) { 
     switch(fileType) { 
     case XML: 
      return new XMLmapper(); 
     case JSON: 
      return new JSONmapper(); 
     } 
     return null; 
    } 
} 

は、両方のファクトリメソッドが異なるインターフェースのインスタンスを生成し、同じcondtionで異なるインタフェースのインスタンスを生成し、ここで同じ条件に依存し、I、Eは両方とも同じ列挙型FILE_TYPEを使用します。

この場合、2つのファクトリメソッドを使用するのは正しいですか? 私は両方のインターフェイスを1つに結合できないという制約があります。

私はJavaの設計に非常に新しいです、親切に私は

+1

あなたの命名はJavaの規約に完全に反しています。クラスは**常に** PascalCaseです。 'camelCase'は変数のために予約されています。 'UPPER_SNAKE_CASE'はコンパイル時定数のために予約されています。それに応じてコードを更新してください。 –

+1

実際の質問に関しては、 'getParser'メソッドと' getMapper'メソッドで 'interface ParserMapper'などを作成することをお勧めします。あなたの工場で 'ParserMapper'を返すようにしましょう。これは' XmlMapper'を 'JsonParser'で使う理由がない限りです。 –

+0

@BoristheSpiderあなたは正しいですが、パーサーだけが別のモジュールで再利用されるので、私は両方を分けています。 – sujin

答えて

2

いいえ、あなたの現在の設計が間違っているのに役立ちます。

あなたのコードは明らかにopen closed principleすなわちに違反している、あなたが(またはそれ以降、いくつかの他のパーサ)HTMLパーサーを追加したい場合ので、良いデザインではありませんあまりにも多くの場所、でswitch文で終わるだろう、 2つのFactoryクラスにswitchステートメントを追加する必要があります。私はパーサを再利用するシステム にマッパーの実装を共有したくない

interface ContentHandler { 
    public void parse(); 
    public void map(); 
} 


public class XMLContentHandler implements ContentHandler { 

    public void parse() { } 

    public void map() { } 
} 


public class JSONContentHandler implements ContentHandler { 

    public void parse() { } 

    public void map() { } 
} 

class ContentFactory { 
    public static ContentHandler getInstance(FILE_TYPE fileType) { 
     switch(fileType) { 
     case XML: 
      return new XMLContentHandler(); 
     case JSON: 
      return new JSONContentHandler(); 
     } 
     return null; 
    } 
} 

ソリューションは、以下のようにあなたはAbstract Factoryパターンを使用する必要があります。以下に示すように

ParsingMapping責任はその後single responsibility原則を遵守思われる、独自のクラス(のようXMLParserXMLMapperJSonParser、等。)によって処理されなければなりません。

public class XMLContentHandler implements ContentHandler { 

     @Inject 
     private XMLParser xmlParser; 

     @Inject 
     private XMLMapper xmlMapper; 


     public void parse() { 
      xmlParser.parse(); 
     } 

     public void map() { 
      xmlMapper.map(); 
     } 
} 
+0

あなたの答えをありがとう。このパーサーでは、システム内の他のモジュールによって再利用されます。マッパーの実装は非常に巨大なので、マッパーの実装をパーサーを再利用するシステムと共有したくないのです。 – sujin

+0

'XMLMapperImpl'と' XMLParserImpl'を上記の 'XMLHandler'に挿入することをお勧めします。同様にJSon – developer

+0

のために私は非常に新しい新しいオブジェクト指向の設計です、あなたは私に小さなコードサンプルを与えてください – sujin