例えば、工場では商品を作り、ある処理を行うというフローがある時には
- public abstract class Factory {
- /**
- * 商品を作る.
- * @param name 商品名
- */
- public final Product create(String name) {
- Product p = createProduct(name);
- doSomething(p);
- return p;
- }
- protected abstract Product createProduct(String name);
- protected abstract void doSomething(Product p);
- }
のようにしておきます。具体的な処理はこのクラスを継承して、
- public class SampleFactory extends Factory {
- protected Product createProduct(name){
- return new SampleProduct(name);
- }
- protected void doSomething(Product p) {
- ・・・
- }
- }
とします。Mainとなるクラス(Factoryを呼ぶクラス)は以下のような処理があれば良いです。
- Factory factory = new SampleFactory();
- Product product = factory.create("sample");
SampleProductクラスはProductクラスを継承したクラス(具体的な商品を表すクラス)です。
こうすることで、どんな商品が登場しても(Factory、Productクラスを継承したクラスがどんなに増えても)「商品を作って、ある処理を行う」というフローが変わりません。また、フレームワーク側は上記のようなSampleFactoryクラスやSampleProductクラスに依存しません。言い換えると、新商品が登場してもフレームワークを修正する必要がないということです。
関連パターン
「Template Methodパターン」Factory MethodパターンはTemplate Methodパターンの応用例
「Singletonパターン」FactoryクラスはSingletonの場合が多い。
「Compositeパターン」製品がcomposite(製品の中にある製品が含まれる)になる場合がある。
「Iteratorパターン」Iteratorインスタンス作成にはFactory Methodパターンが使われることがある。
0 件のコメント:
コメントを投稿