kurodakazumichi / issues

0 stars 0 forks source link

【デザインパターン】Abstract Factory #33

Open kurodakazumichi opened 6 years ago

kurodakazumichi commented 6 years ago

Abstract Factory Wiki

kurodakazumichi commented 6 years ago

関連するインスタンス群を生成するための API を集約することによって、複数のモジュール群の再利用を効率化することを目的とする。日本語では「抽象的な工場」と翻訳される事が多い。

Wikiはまともに何も書いてなかったので別なサイトを探す。

kurodakazumichi commented 6 years ago

TECHSCOREのサイトを参考に

http://www.techscore.com/tech/DesignPattern/AbstractFactory.html/

ここでは鍋を題材にして説明されている。

default

kurodakazumichi commented 6 years ago

ざっくりどんな話か

様々な鍋を作る工場(Factory)の話ではなくて 鍋に入れる具材を作る工場のお話。 具材工場より鍋工場の方がしっくりくるんだけどなぁ

クラス図

abstract_factory_uml_class_diagram svg

これを見る限りでもAbstract FactoryはProductを生産する工場になっているので 鍋工場ではなく、具材工場という表現が正しいのかなとは思う。

kurodakazumichi commented 6 years ago

鍋に関するAbstractFactoryはこんな感じ。

From To
Client main関数、要はクラスを使って処理する奴
AbstractFactory 鍋工場
Product1 スープ
Product2 メインディッシュ
ConcreteFactory 鶏肉鍋工場
ConcreteProduct1 鳥ガラスープ
ConcreteProduct2 鶏肉
kurodakazumichi commented 6 years ago

抽象クラス 鍋工場

鍋工場は鍋に入れる具材を生産する機能を持っている。 スープとかメインディッシュを作る機能ね。

具象クラス 鶏肉鍋工場

鶏肉鍋工場は鍋工場を継承しているので スープとメインディッシュを作る機能を持っているが

このクラスは具体的なものを生み出す。 スープは鳥ガラスープ メインディッシュは鶏肉

という感じで。

kurodakazumichi commented 6 years ago

いったんまとめ

夫「今夜は鍋にしてー」 妻「何鍋にするの?」 夫「わかんないけどとりあえず鍋」 妻「はっきりしろや」

夫「とりあえず何があれば鍋になるの?」 妻「スープとメインの具と野菜」

この時点で何鍋になるかはわからないが 準備しないといけないものがわかるので

class abstract NaveFactory {
  Soup getSoup();
  Main getMain();
  Vegetables getVegetables();
}

という抽象的な工場としてしまうというのが Abstract Factoryの基本だろう。

kurodakazumichi commented 6 years ago

鳥鍋の例

abstractfactory

豚鍋が追加された例

abstractfactory