package info.istlab.dp.dp1; /** * https://www.techscore.com/tech/DesignPattern/AbstractFactory * https://refactoring.guru/ja/design-patterns/abstract-factory */ 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 {}