[設計モード]抽象系列


Creational Pattern - Abstract Factory

📚 意図する


詳細なサブクラスを定義することなく、複数の相互関連または独立したオブジェクトセットを作成するインタフェースを提供します.(GoF)
基本的な工場は材料を提供し、生産された製品が何なのか分からなくても、製品のインタフェースを知っていれば操作できます.
  • 関連製品の集合:{モニター+キーボード+マウス}
  • 製品集合の変形(製品を作成する会社):
  • Samsung{Monitor + Keyboard + Mouse}
  • LG{Monitor + Keyboard + Mouse}
  • Apple{Monitor + Keyboard + Mouse}
  • 🧱 こうぞう


  • Abstract Products : ProductA , ProductB
  • ディスプレイ、キーボード、マウスコネクタ
  • Concrete Products : ConcreteProductA1 , ConcreteProductA2 / ConcreteProductB1 , ConcreteProductB2
  • サムスンディスプレイ、LGディスプレイ/サムスンキーボード、LGキーボード
  • Abstract Factory : createProductA():ProductA , createProductB():ProductB
  • ディスプレイ生産、キーボード生産、マウス生産
  • Concrete Factories : createProductA():ConcreteProductA1 , createProductB():ConcreteProductB1
  • 三星工場:三星ディスプレイ、三星キーボード、三星マウスを生産する.
  • LG工場:LGディスプレイを生産し、LGキーボードを生産し、LGマウスを生産する.
  • クライアント:Abstract FactoryAbstract Products使用
  • 💻 コード#コード#


  • Abstract Products
    public interface Monitor {
        void turnOn();
    }
    
    public interface Keyboard {
        void type();
    }
    
    public interface Mouse {
        void click();
    }

  • Concrete Products
    // Monitor
    public class SamsungMonitor implements Monitor {
        @Override
        public void turnOn() {
            System.out.println("Samsung 모니터");
        }
    }
    
    public class LGMonitor implements Monitor {
        @Override
        public void turnOn() {
            System.out.println("LG 모니터");
        }
    }
    
    public class AppleMonitor implements Monitor {
        @Override
        public void turnOn() {
            System.out.println("Apple 모니터");
        }
    }
    
    // Keyboard
    public class SamsungKeyboard implements Keyboard {
        @Override
        public void type() {
            System.out.println("Samsung 키보드");
        }
    }
    
    public class LGKeyboard implements Keyboard {
        @Override
        public void type() {
            System.out.println("LG 키보드");
        }
    }
    
    public class AppleKeyboard implements Keyboard {
        @Override
        public void type() {
            System.out.println("Apple 키보드");
        }
    }
    
    // Mouse도 동일

  • Abstract Factory
    public interface CompanyFactory {
        Monitor createMonitor();
    
        Keyboard createKeyboard();
    
        Mouse createMouse();
    }

  • Concrete Factories
    public class SamsungFactory implements CompanyFactory {
        @Override
        public Monitor createMonitor() {
            return new SamsungMonitor();
        }
    
        @Override
        public Keyboard createKeyboard() {
            return new SamsungKeyboard();
        }
    
        @Override
        public Mouse createMouse() {
            return new SamsungMouse();
        }
    }
    
    public class LGFactory implements CompanyFactory {
        @Override
        public Monitor createMonitor() {
            return new LGMonitor();
        }
    
        @Override
        public Keyboard createKeyboard() {
            return new LGKeyboard();
        }
    
        @Override
        public Mouse createMouse() {
            return new LGMouse();
        }
    }
    
    public class AppleFactory implements CompanyFactory {
        @Override
        public Monitor createMonitor() {
            return new AppleMonitor();
        }
    
        @Override
        public Keyboard createKeyboard() {
            return new AppleKeyboard();
        }
    
        @Override
        public Mouse createMouse() {
            return new AppleMouse();
        }
    }

  • Client
    public class Client {
        private static final CompanyFactory FACTORY = new Application().createFactory();
    
        public static void main(String[] args) {
            Monitor monitor = FACTORY.createMonitor();
            monitor.turnOn();
    
            Keyboard keyboard = FACTORY.createKeyboard();
            keyboard.type();
    
            Mouse mouse = FACTORY.createMouse();
            mouse.click();
        }
    }
    に注意
  • アプリケーションは環境設定に応じてファクトリタイプを選択し、初期化段階で具体的なファクトリオブジェクトを作成する.

  • Console
    // 입력
    APPLE
    
    // 출력
    Apple 모니터
    Apple 키보드
    Apple 마우스
  • 🔮 メリットとデメリット

  • メリット
  • オープン原則:コレクションに新製品または製品シリーズを追加する場合、コアコードを変更する必要はありません.
  • クライアントと工場で生産された製品は別とすることができる.
  • クライアントコードと具体的な製品との結合性を低下させる.
  • オブジェクトセットを生成する場合に便利
  • 工場から入手した製品の互換性が確認できます.
  • デメリット
  • 多くのインタフェースとクラス->複雑なコード
  • ➰はどんな場合に使いますか。

  • Collectioniterator
  • ジェネレータモードでは奇形腫の実現にも用いられる.何が一緒に使われているのか調べる必要があります!
  • 「アレイメソッド」Patternとの違いは?


    Factory Method
  • 条件により生成されたオブジェクトを工場に委任する.
  • Abstract Factory

  • 関連するオブジェクトを組み合わせてFactoryにします.

  • 条件によって.の工場が作成され、工場が再作成され、委任されます.
  • ソース

  • https://johngrib.github.io/wiki/abstract-factory-pattern/
  • https://velog.io/@chrishan/abstract-factory-pattern