の続きの小ネタです
Simple Factory パターンとは
Abstract Factory の簡易版で、状況によってクラスを切り替えたい場合に利用する。よくAbstract Factoryと勘違いして使用されていることがある。
Clientコード
executeでファクトリから何がしかのProductを取得して処理する。
public class Client { private SimpleFactory factory; public Client(SimpleFactory factory) { this.factory = factory; } public void execute(char type) { Product p = factory.createProduct(type); System.out.println(p.getName()); } }
これを実行するテストコード
@Test public void tearA() throws Exception { Client c = new Client(new SimpleFactory()); c.execute('A'); c.execute('B'); }
ファクトリクラス
何かしらのキーをもらって作成するインスタンスを切り替えている。
public class SimpleFactory { public Product createProduct(char key) { switch (key) { case 'A' : return new ProductA(); case 'B' : return new ProductB(); default: throw new RuntimeException("no target"); } } }
でも大抵は以下のようにstaticにする場合が多いけどネ
public static Product createProduct(char type) {
あと、SimpleFactoryをいじらなくて言いように、クラス名を受け取って
public Product createProduct(String className) { try{ return (Product)Class.forName(className).newInstance(); } catch(Exception e){ throw new RuntimeException(e); }
みたいな実装もあります。classNameには"simplefactory.product.impl.ProductA"のようなクラス名を直接指定します。
Product
public interface Product { String getName(); }
public class ProductA implements Product { @Override public String getName() { return "ProductA"; } }
public class ProductB implements Product { @Override public String getName() { return "ProductB"; } }
実行結果
実行結果は以下のようになります。
ProductA ProductB