[設計モード]抽象系列
Creational Pattern - Abstract Factory
詳細なサブクラスを定義することなく、複数の相互関連または独立したオブジェクトセットを作成するインタフェースを提供します.(GoF)
基本的な工場は材料を提供し、生産された製品が何なのか分からなくても、製品のインタフェースを知っていれば操作できます.例 関連製品の集合:{モニター+キーボード+マウス} 製品集合の変形(製品を作成する会社): Samsung{Monitor + Keyboard + Mouse} LG{Monitor + Keyboard + Mouse} Apple{Monitor + Keyboard + Mouse}
Abstract Products : ディスプレイ、キーボード、マウスコネクタ Concrete Products : サムスンディスプレイ、LGディスプレイ/サムスンキーボード、LGキーボード Abstract Factory : ディスプレイ生産、キーボード生産、マウス生産 Concrete Factories : 三星工場:三星ディスプレイ、三星キーボード、三星マウスを生産する. LG工場:LGディスプレイを生産し、LGキーボードを生産し、LGマウスを生産する. クライアント:
Abstract Products
Concrete Products
Abstract Factory
Concrete Factories
Client アプリケーションは環境設定に応じてファクトリタイプを選択し、初期化段階で具体的なファクトリオブジェクトを作成する.
Console メリット オープン原則:コレクションに新製品または製品シリーズを追加する場合、コアコードを変更する必要はありません. クライアントと工場で生産された製品は別とすることができる. クライアントコードと具体的な製品との結合性を低下させる. オブジェクトセットを生成する場合に便利 工場から入手した製品の互換性が確認できます. デメリット 多くのインタフェースとクラス->複雑なコード ジェネレータモードでは奇形腫の実現にも用いられる.何が一緒に使われているのか調べる必要があります!
Factory Method条件により生成されたオブジェクトを工場に委任する. Abstract Factory
関連するオブジェクトを組み合わせてFactoryにします.
条件によって.の工場が作成され、工場が再作成され、委任されます.
https://johngrib.github.io/wiki/abstract-factory-pattern/ https://velog.io/@chrishan/abstract-factory-pattern
📚 意図する
詳細なサブクラスを定義することなく、複数の相互関連または独立したオブジェクトセットを作成するインタフェースを提供します.(GoF)
基本的な工場は材料を提供し、生産された製品が何なのか分からなくても、製品のインタフェースを知っていれば操作できます.
🧱 こうぞう
ProductA
, ProductB
ConcreteProductA1
, ConcreteProductA2
/ ConcreteProductB1
, ConcreteProductB2
createProductA():ProductA
, createProductB():ProductB
createProductA():ConcreteProductA1
, createProductB():ConcreteProductB1
Abstract Factory
・Abstract 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 마우스
🔮 メリットとデメリット
➰はどんな場合に使いますか。
Collection
医iterator
「アレイメソッド」Patternとの違いは?
Factory Method
関連するオブジェクトを組み合わせてFactoryにします.
条件によって.の工場が作成され、工場が再作成され、委任されます.
ソース
Reference
この問題について([設計モード]抽象系列), 我々は、より多くの情報をここで見つけました https://velog.io/@jummi10/디자인-패턴-Abstract-Factoryテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol