package info.istlab.dp.dp1;
/**
* AbstractFactory
* GUIコンポーネントのスタイル、データベース接続の抽象化など
* https://www.techscore.com/tech/DesignPattern/AbstractFactory
* https://refactoring.guru/ja/design-patterns/abstract-factory
*
* 関連:Builder (構築手順が複雑で段階を踏む必要がある、多くのオプションやパラメータがあり、一部省略可能)
*/
public class AbstractFactoryTest {
public static void main(String[] args) {
NoodleFactory sio_ramen_factory = new SioRamenFactory(); //塩ラーメンを作るファクトリークラス
Dish dish = sio_ramen_factory.getDish(); // 塩ラーメンに適した食器を準備
dish.putSoup(sio_ramen_factory.getSoup()); // スープを食器に入れる
dish.putNoodle(sio_ramen_factory.getNoodle()); // 麺を食器に入れる
}
}
abstract class NoodleFactory {
public abstract Soup getSoup();
public abstract Noodle getNoodle();
public abstract Dish getDish();
}
abstract class AbstractRamenFactory extends NoodleFactory {
@Override
public Noodle getNoodle() { return new Ramen(); } // 麺はラーメン
@Override
public Dish getDish() { return new Bowl(); } // ラーメン用の丼ぶり
}
class SioRamenFactory extends AbstractRamenFactory {
@Override
public Soup getSoup() { return new SioSoup(); } // スープは塩スープ
}
class MisoRamenFactory extends AbstractRamenFactory {
@Override
public Soup getSoup() { return new MisoSoup(); } // スープは味噌スープ
}
class TomatoPastaFactory extends NoodleFactory {
@Override
public Soup getSoup() { return new TomatoSource(); } // ソースはトマトソース
@Override
public Noodle getNoodle() { return new Spaghetti(); } // 麺はスパゲッティ
@Override
public Dish getDish() { return new Plate(); } // パスタ用の皿
}
abstract class Soup { /* スープ・ソース */}
class SioSoup extends Soup {}
class MisoSoup extends Soup {}
class CurrySoup extends Soup {}
class TomatoSource extends Soup {}
class CreamySource extends Soup {}
abstract class Noodle { /* 麺 */ }
class Ramen extends Noodle {}
class Udon extends Noodle {}
class Soba extends Noodle {}
class Spaghetti extends Noodle {}
class Dish { /* 食器 */
Noodle noodle;
Soup soup;
void putNoodle(Noodle _n){
noodle = _n;
}
void putSoup(Soup _s){
soup = _s;
}
}
class Bowl extends Dish {}
class Plate extends Dish {}