package info.istlab.dp.dp1; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; /** * オペレーティングシステムによって異なる改行の扱いを抽象化 * * Factoryパターン:オブジェクトの生成をカプセル化する。Factoryクラスが提供するメソッドを呼び出すと、引数や状況によって * 適切なサブクラスのオブジェクトを生成してくれる。(例:Calendarクラス) * * FactoryMethodパターン:FactoryパターンにおけるFactoryクラスが唯一ではなく、Factoryクラスの * サブクラスが複数存在しており、それぞれのサブクラスがオブジェクト生成メソッド(Factoryメソッド)を定義している。 * https://refactoring.guru/ja/design-patterns/factory-method * では、ロジスティックスクラスのサブクラスである陸上運輸と海上運輸が、createTransport()をオーバーライドしており、 * 陸上運輸はTruck、海上運輸はShipオブジェクトを返す。 */ public class FactoryMethodTest { public static void main(String[] args) { TextFile file = TextFile.createTextFile(); System.out.println("生成されたオブジェクトのクラスは ["+file.getClass().getSimpleName()+"] です"); ArrayList<String> lines = new ArrayList<String>(); lines.add("aaa"); lines.add("bbb"); lines.add("ccc"); file.write(lines, "logfile.txt"); Calendar cal = Calendar.getInstance(); System.out.println(cal.getClass().getName()); } } class TextFile { protected String EOL; protected TextFile(){} public static TextFile createTextFile(){ String os = System.getProperty("os.name").toLowerCase(); System.out.println(os); if (os.contains("windows")){ return new WinTextFile(); // CR LF (0x0D 0x0A) \r\n } else if (os.contains("oldmac")){ return new OldMacTextFile(); // CR } else if (os.contains("linux") || os.contains("mac os x")){ return new LinuxTextFile(); // LF } return null; } public void write(ArrayList<String> lines, String filename){ try { FileWriter filewriter = new FileWriter(filename, false); for(String line: lines){ filewriter.write(line + EOL); // 改行の種類 } filewriter.close(); } catch (IOException e) { System.out.println("WriteError:" + filename); } } } class WinTextFile extends TextFile { WinTextFile(){ EOL = "\r\n"; } } class OldMacTextFile extends TextFile { OldMacTextFile(){ EOL = "\r"; } } class LinuxTextFile extends TextFile { LinuxTextFile(){ EOL = "\n"; } }