【Java】FactoryMethodを使ったファイル読込み機能の実装

# メモ
自分用のメモ

# クラス図

![クラス図0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671881/6e226db9-c26c-65e7-3839-e48e6341949a.png)

# 実装

```java:InterfaceFileReader.java
package factoryMethodPattern;

import java.io.IOException;

public interface InterfaceFileReader {

	//共通して使うメソッド1を定義する(ファイルを読み込むメソッド)
	public int readFile() throws IOException;

	//共通して使うメソッド2を定義する(ファイルを閉じるメソッド)
	public void closeFile() throws IOException;
}


```

```java:FileReaderFactory.java
package factoryMethodPattern;

import java.io.File;
import java.io.FileNotFoundException;

public class FileReaderFactory {

	public static InterfaceFileReader create(String fileType , File filePath) throws FileNotFoundException{

		//CSVファイル
		if(fileType.equals("CSV")){
			return new CSVFileReader(filePath);
		}

		//固定長ファイル
		if(fileType.equals("FixedLength")){
			return new FixedLengthFileReader(filePath);
		}

		//XMLファイル
		if(fileType.equals("XML")){
			return new XMLFileReader(filePath);
		}

		return null;
	}
}

```



```java:CSVFileReader.java
package factoryMethodPattern;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class CSVFileReader implements InterfaceFileReader{
	//フィールド
	private FileInputStream fileInputStream;

	//コンストラクタ
	public  CSVFileReader(File csvFileReader) throws FileNotFoundException {
		fileInputStream = new FileInputStream(csvFileReader);
	}

	//ファイルを読込むメソッド
	@Override 
	public int readFile() throws IOException {
		System.out.println("CSVファイル特有の処理をします");
		int byteData = 0;

		if(fileInputStream != null){
			byteData = fileInputStream.read();
		}
		return byteData;
	}

	//ファイルをクローズするメソッド
	@Override 
	public void closeFile() throws IOException {
		if(fileInputStream != null){
			fileInputStream.close();
		}
	}
}


```

```java:FixedLengthFileReader.java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FixedLengthFileReader implements InterfaceFileReader{
	//フィールド
	private FileInputStream fileInputStream;

	//コンストラクタ
	public  FixedLengthFileReader(File fixedLengthFile) throws FileNotFoundException {
		fileInputStream = new FileInputStream(fixedLengthFile);
	}

	//ファイルを読込むメソッド
	@Override 
	public int readFile() throws IOException {
		System.out.println("固定長ファイル特有の処理をします");
		int byteSize = 0;

		if(fileInputStream != null){
			byteSize = fileInputStream.read();
		}
		return byteSize;
	}

	//ファイルをクローズするメソッド
	@Override
	public void closeFile() throws IOException {
		if(fileInputStream != null){
			fileInputStream.close();
		}
	}
}

```

```java:XMLFileReader.java

package factoryMethodPattern;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class XMLFileReader implements InterfaceFileReader{
	//フィールド
	private FileInputStream fileInputStream;

	//コンストラクタ
	public  XMLFileReader(File xmlFileReader) throws FileNotFoundException {
		fileInputStream = new FileInputStream(xmlFileReader);
	}

	//ファイルを読込むメソッド
	@Override
	public int readFile() throws IOException {
		System.out.println("XMLファイル特有の処理をします");
		int byteSize = 0;

		if(fileInputStream != null){
			byteSize = fileInputStream.read();
		}
		return byteSize;
	}

	//ファイルをクローズするメソッド
	@Override
	public void closeFile() throws IOException {
		if(fileInputStream != null){
			fileInputStream.close();
		}
	}
}
```


```java:Main.java
package factoryMethodPattern;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Main {
	private static InterfaceFileReader interfaceFileReader;


	public static void main(String[] args) {
		System.out.println("処理を開始します。");

		// fileType filePathを変更することで処理を切り替えることができる。
		String fileType = "CSV";
		File   filePath = new File("test.csv");

		try {
			//FileReaderFactoryのstaticメソッドを呼び出し。
			interfaceFileReader = FileReaderFactory.create(fileType, filePath);
			if(interfaceFileReader == null){
				System.out.println("処理を異常終了します。");
				System.exit(1);
			}

			//ファイル読込み数の取得
			int readData = interfaceFileReader.readFile();

			//int型で表示//char型で表示
			System.out.println("int型 : " + readData);
			System.out.println("char型: " + (char)readData  );

			System.out.println("処理を終了します。");

		} catch (FileNotFoundException e) {
			System.out.println("読込みファイルが見つかりません。");
			e.printStackTrace();

		} catch (IOException e) {
			System.out.println("入出力例外発生");
			e.printStackTrace();
		}
	}
}

```