Newer
Older
DesignPattern / src / main / java / info / istlab / dp / dp1 / AbstractFactoryTest.java
@motoki miura motoki miura on 17 Oct 2023 2 KB d
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 {}