package info.istlab.dp.dp1;

/**
 * オペレーティングシステムによって異なる改行の扱いを抽象化
 * 
 * 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) {
        DocumentCreator creator = new WordCreator();
        creator.openDocument();  // Word文書を開く
    }
}

// Product
interface Document {
    void open();
}

// Concrete Products
class WordDocument implements Document {
    public void open() { System.out.println("Word文書を開く"); }
}
class PdfDocument implements Document {
    public void open() { System.out.println("PDF文書を開く"); }
}

// Creator (Factory)
abstract class DocumentCreator {
    // 生成メソッド
    protected abstract Document createDocument();

    public void openDocument() {
        Document doc = createDocument();
        doc.open();
    }
}

// Concrete Creators
class WordCreator extends DocumentCreator {
    protected Document createDocument() { return new WordDocument(); }
}
class PdfCreator extends DocumentCreator {
    protected Document createDocument() { return new PdfDocument(); }
}