liguofeng29’s blog

個人勉強用ブログだっす。

デザインパターン - AbstractFactory

【abstract factoryパターンとは】

抽象工場で抽象部品を生成する

 

abstract factoryパターンのクラス図】

 

abstract factoryパターンのメリット】

さ~

 

【サンプル】

NabeFactory.java
package abstractFactory.abstractItem;
 
// 抽象なべ工場
public abstract class NabeFactory {
public abstract Soup getSoup();
public abstract MainMaterial getMainMaterial();
}
 
 
 
 

 

MainMaterial.java
package abstractFactory.abstractItem;
 
// 抽象部品
public abstract class MainMaterial {
public abstract String getName();
}
 
 

 

Soup.java
package abstractFactory.abstractItem;
 
// 抽象部品
public abstract class Soup {
public abstract String getName();
}
 
 
 
 

 

CabbageNabeFactory.java
 
import abstractFactory.abstractItem.MainMaterial;
import abstractFactory.abstractItem.NabeFactory;
import abstractFactory.abstractItem.Soup;
 
// きゃべっつ鍋工場
public class CabbageNabeFactory extends NabeFactory{
 
@Override
public MainMaterial getMainMaterial() {
return new CabbageMainMaterial();
}
 
@Override
public Soup getSoup() {
return new CabbageSoup();
}
}
 
 
 
 

 

CabbageMainMaterial.java
 
import abstractFactory.abstractItem.MainMaterial;
 
// キャベっつ鍋材料
public class CabbageMainMaterial extends MainMaterial{
 
@Override
public String getName() {
return "キャベッツ";
}
}
 
 
 
 
 
 
CabbageSoup.java
 
import abstractFactory.abstractItem.Soup;
 
// きゃべっつ鍋スープ
public class CabbageSoup extends Soup {
 
@Override
public String getName() {
return "白だし";
}
}
 
 
 
 
 
 
ToriNabeFactory.java
 
import abstractFactory.abstractItem.MainMaterial;
import abstractFactory.abstractItem.NabeFactory;
import abstractFactory.abstractItem.Soup;
 
// 鶏なべ工場
public class ToriNabeFactory extends NabeFactory {
 
@Override
public MainMaterial getMainMaterial() {
return new ToriMainMaterial();
}
 
@Override
public Soup getSoup() {
return new ToriSoup();
}
}
 
 
 
 

ToriMainMaterial.java
 
import abstractFactory.abstractItem.MainMaterial;
 
// 鶏なべ材料
public class ToriMainMaterial extends MainMaterial {
 
@Override
public String getName() {
return "鶏肉";
}
}
 
 
 
 
 
 
 
ToriSoup.java
 
import abstractFactory.abstractItem.Soup;
 
// 鶏なべスープ
public class ToriSoup extends Soup {
 
@Override
public String getName() {
return "鶏スープ";
}
}
 
 
 
 
 
AbstractFactoryTest.java
 
import abstractFactory.abstractItem.NabeFactory;
 
public class AbstractFactoryTest {
 
public static void main(String[] args) {
 
// なべ容器生成
HotPot h = new HotPot();
 
// 鶏なべ工場
NabeFactory factory = new ToriNabeFactory();
 
h.addSoup(factory.getSoup());
h.addMainMaterial(factory.getMainMaterial());
 
h.info();
 
// きゃべっつなべ工場
factory = new CabbageNabeFactory();
h.addSoup(factory.getSoup());
h.addMainMaterial(factory.getMainMaterial());
 
h.info();
}
}

 

実行結果
スープ : 鶏スープ
メイン具材 : 鶏肉
スープ : 白だし
メイン具材 : キャベッツ