目次
Javaちょっとできるプログラマ。教育業界のエンジニアです。
工作HardwareHubからのお知らせ
ある処理フローの大まかな流れを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
0
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...