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 {}