モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

Java Factory Method デザインパターン

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2013/08/16
最終更新最終更新
2018/10/07
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    Javaちょっとできるプログラマ。教育業界のエンジニアです。

    0
    ステッカーを贈るとは?

    ある処理フローの大まかな流れを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
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    Javaちょっとできるプログラマ。教育業界のエンジニアです。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • Spring Security フォームログインのサンプルコード
        Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
        えびちゃんえびちゃん12/4/2019に更新
        いいねアイコン画像0
      • 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]; となる。 初期化
        てんとうむしてんとうむし5/13/2018に更新
        いいねアイコン画像0
      • PlantUML による UML 図の描き方
        サムネイル画像-c788fffde5
        PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
        kentakenta1/21/2020に更新
        いいねアイコン画像0
      • Akka HTTP サンプルコード (Scala)
        サムネイル画像-a98142497c
        Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
        雄太雄太10/7/2021に更新
        いいねアイコン画像0
      • Kestrel の使用例
        Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
        したくんしたくん10/12/2017に更新
        いいねアイコン画像0