Factory Methodパターンの実装例 (Java)
[履歴] [最終更新] (2016/06/03 21:56:20)
最近の投稿
注目の記事

概要

こちらのページでは、ある処理フローの大まかな流れをAbstractClassに記述しておき、実際の具体的な処理はConcreteClassに記述するという、システムのフレームワークを実装する場合に有用なTemplate Methodパターンを紹介しました。このTemplate Methodを用いて、インスタンスの生成処理のフレームワークを実装する場合を特にFactory Methodパターンとよびます。

サンプルコード

ディレクトリ構造

ファイル分割やアクセス修飾子については、こちらのページを参照してください。

$ tree .
.
|-- concrete01
|   |-- Factory01.java
|   `-- Product01.java
|-- framework
|   |-- Factory.java
|   `-- Product.java
`-- sample.java

Main

sample.java

import framework.*;
import concrete01.*;

class Sample {
    public static void main(String args[]) {
        Factory factory = new Factory01();

        Product p1 = factory.create(100);
        System.out.println("Price: " + p1.getPrice());

        Product p2 = factory.create(200);
        System.out.println("Price: " + p2.getPrice());
    }
}

framework

Product.java

package framework;
public abstract class Product {public abstract int getPrice();}

Factory.java

package framework;

public abstract class Factory {
    // privateとabstractを組合せることは内容が矛盾するため根本的に設定不可
    // - private: クラス外からアクセス不能
    // - abstract: サブクラスというクラス外からアクセスすることを要求
    protected abstract Product createProduct(int price);
    protected abstract void someTask(Product product);

    public final Product create(int price) { //いわゆるTemplateMethodをインスタンス生成に適用
        Product p = createProduct(price);
        someTask(p);
        return p;
    }
}

concrete01

Product01.java

package concrete01;
import framework.*;

public class Product01 extends Product {
    private int price;
    protected Product01(int price) {this.price=price;}
    public int getPrice() {return price;}
    public int getInitialCost() {return (int)(price*0.7);} //Product01の原価計算式
}

Factory01.java

package concrete01;
import framework.*;

public class Factory01 extends Factory {
    protected Product createProduct(int price) {return new Product01(price);}
    protected void someTask(Product product) {
        System.out.println("Initial Cost:" + ((Product01)product).getInitialCost());
    }
}

実行例

$ javac sample.java concrete01/*.java framework/*.java && java Sample
Initial Cost:70
Price: 100
Initial Cost:140
Price: 200
関連ページ
    サンプルコード #include <iostream> using namespace std; class MyClass { public: virtual ~MyClass(); // 仮想デストラクタ public: virtual void Say() = 0; }; class MySubClass : public MyClass { public:
    概要 AngularJS のビルトインサービスのうち代表的なものをコード例とともに列挙します。公式ドキュメントはこちらです。 <!DOCTYPE html> <html lang="ja" ng-app="myApp"> <head> <meta charset="utf-8"> <script src="angular.min.js"></script> </head> <body>