Factory method patternとは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > 百科事典 > Factory method patternの意味・解説 

Factory Method パターン

(Factory method pattern から転送)

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2014/02/19 15:49 UTC 版)

Factory Method パターン(ファクトリメソッド・パターン)[1]とは、GoF (Gang of Four; 四人組)によって定義されたデザインパターンの1つである。 Factory Method パターンは、他のクラスのコンストラクタをサブクラスで上書き可能な自分のメソッドに置き換えることで、 アプリケーションに特化したオブジェクトの生成をサブクラスに追い出し、クラスの再利用性を高めることを目的とする。

Virtual Constructor パターンとも呼ばれる[1]

クラス図

Factory Method パターンのクラス図は以下の通りである。

ここで、anOperationはfactoryMethodを呼び出し、Productのサブクラスのインスタンスを得て、利用する。factoryMethodのようなメソッドはfactory methodと呼ばれる。

factoryMethodは、デフォルトの動作を含んだ具象メソッドである場合もある。パラメータを取り、それによって生成するクラスを変えることもある。ConcreteCreatorごとの操作手段を Productとして他のクラスに提供するようなケースでは、factoryMethodをpublicとして公開する。[1]。しかし、factoryMethodは上書きされることが前提であるため、privateにはしない。

利用例

例として、Java でリストの要素をさまざまな順で表示するプログラムを考える。このソースコードは J2SE 1.5 以降のバージョンで動作する。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
// Creatorに相当する
abstract class ListPrinter {
    // anOperationに相当する
    public void printList(List<String> list) {
        Comparator<String> comparator = createComparator();
        list = new ArrayList<String>(list);
 
        Collections.sort(list, comparator);
 
        for (String item : list) {
            System.out.println(item);
        }
    }
 
    // factoryMethodに相当する
    protected abstract Comparator<String> createComparator();
}
 
// ConcreteCreatorに相当する
class DictionaryOrderListPrinter extends ListPrinter {
    @Override
    protected Comparator<String> createComparator() {
        return new DictionaryOrderComparator();
    }
}
 
// java.util.ComparatorがProductに相当する
 
// ConcreteProductに相当する
class DictionaryOrderComparator implements Comparator<String> {
    @Override
    public int compare(String str1, String str2) {
        return str1.compareTo(str2);
    }
}
 
// ConcreteCreatorに相当する
class LengthOrderListPrinter extends ListPrinter {
    @Override
    protected Comparator<String> createComparator() {
        return new LengthOrderComparator();
    }
}
 
// ConcreteProductに相当する
class LengthOrderComparator implements Comparator<String> {
    public int compare(String str1, String str2) {
        return str1.length() - str2.length();
    }
}
 
// メインクラス
public class FactoryMethodSample {
    public static void main(String args[]) {
        List<String> list = Arrays.asList("いちご", "もも", "いちじく");
 
        System.out.println("五十音順で表示:");
        new DictionaryOrderListPrinter().printList(list);
 
        System.out.println();
 
        System.out.println("長さ順で表示:");
        new LengthOrderListPrinter().printList(list);
    }
}

このプログラムは、以下の結果を出力する。

五十音順で表示:
いちご
いちじく
もも

長さ順で表示:
もも
いちご
いちじく

前半ではリストを五十音順で表示し、後半ではリストを文字列の長さ順に表示している。 リストを並び変えて表示するListPrinter#printListメソッドでは、並び変えに使うComparatorを生成する際にnew演算子を使って直接生成するのではなく、抽象メソッドcreateComparatorを使ってサブクラスに生成を委ねる。

関係するパターン

factory methodは普通template method (Template Method パターンを参照)であるanOperationから呼ばれる。ただし、factory methodをpublicにして他のクラスからも呼ぶ場合もある[1]

Abstract Factory パターンのAbstractFactoryクラスはfactory methodを持ち、それを個々のサブクラスが上書きして生成するProductを変える手法が一般的である。しかし、Prototype パターンを使い、prototypeとなるオブジェクトの変更により生成するProductを変える手法もある[1]

Abstract Factory パターンとの違い

『オブジェクト指向における再利用のためのデザインパターン』においてはFactory Method パターンは「クラスパターン」に分類されている。一方Abstract Factory パターンは「オブジェクトパターン」に分類されている。

Factory Method パターンは親クラスであるCreatorクラスが子クラスであるConcreteCreatorクラスにオブジェクトの生成を委ねるという、CreatorクラスとConcreteCreatorクラスとの関連である。一方でAbstract Factory パターンは、ClientのインスタンスがConcreteFactoryのインスタンスにオブジェクトの生成を委ねるという、オブジェクト同士の関連である。

関連項目

参考文献

  1. ^ a b c d e エリック・ガンマラルフ・ジョンソンリチャード・ヘルムジョン・ブリシディース(著)、グラディ・ブーチ(まえがき)、本位田真一、吉田和樹(監訳)、『オブジェクト指向における再利用のためのデザインパターン』、ソフトバンクパブリッシング、1995。ISBN 978-4-7973-1112-9.

「Factory method pattern」の例文・使い方・用例・文例

Weblio日本語例文用例辞書はプログラムで機械的に例文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「Factory method pattern」の関連用語

Factory method patternのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Factory method patternのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのFactory Method パターン (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
Tanaka Corpusのコンテンツは、特に明示されている場合を除いて、次のライセンスに従います:
 Creative Commons Attribution (CC-BY) 2.0 France.
この対訳データはCreative Commons Attribution 3.0 Unportedでライセンスされています。
浜島書店 Catch a Wave
Copyright © 1995-2025 Hamajima Shoten, Publishers. All rights reserved.
株式会社ベネッセコーポレーション株式会社ベネッセコーポレーション
Copyright © Benesse Holdings, Inc. All rights reserved.
研究社研究社
Copyright (c) 1995-2025 Kenkyusha Co., Ltd. All rights reserved.
日本語WordNet日本語WordNet
日本語ワードネット1.1版 (C) 情報通信研究機構, 2009-2010 License All rights reserved.
WordNet 3.0 Copyright 2006 by Princeton University. All rights reserved. License
日外アソシエーツ株式会社日外アソシエーツ株式会社
Copyright (C) 1994- Nichigai Associates, Inc., All rights reserved.
「斎藤和英大辞典」斎藤秀三郎著、日外アソシエーツ辞書編集部編
EDRDGEDRDG
This page uses the JMdict dictionary files. These files are the property of the Electronic Dictionary Research and Development Group, and are used in conformance with the Group's licence.

©2025 GRAS Group, Inc.RSS