1.1 シンプル ファクトリ パターン
シンプル ファクトリ パターンはクラスの作成であり、静的ファクトリ メソッド パターンとも呼ばれます。単純なファクトリ パターンでは、ファクトリ オブジェクトを使用して、製品クラスのどのインスタンスを作成するかを決定します。
1.1.1 ファクトリ パターンのいくつかの形式
ファクトリ パターンは、特に、共通のインターフェイスを持つ多数のクラスをインスタンス化する役割を果たします。ファクトリ パターンは、どのクラスをインスタンス化するかを動的に決定できます。 ファクトリ パターンには次の形式があります:
シンプル ファクトリ (シンプル ファクトリ) パターン: 静的ファクトリ メソッド (静的ファクトリ メソッド) パターンとも呼ばれます。
ファクトリ メソッド パターン: ポリモーフィック ファクトリ パターンまたは仮想コンストラクタ パターンとも呼ばれます。
抽象ファクトリー パターン: ツールボックス (キットまたはツールキット) パターンとも呼ばれます。
下の図は、単純なファクトリ パターンの簡略化されたクラス図を示しています。
単純なファクトリ パターン、または静的なファクトリ メソッド パターンは、さまざまなファクトリ メソッド パターンの特別な実装です。 Java言語では、通常のファクトリメソッドパターンではデザイン機能を縮退させて静的ファクトリメソッドパターンを与えることができません。
1.1.2 簡易工場モード(一般モード)の導入
たとえば、リンゴ、イチゴ、ブドウなどのさまざまな果物を生産する農場があるとします。 、対応する果物が提供されます。以下に示すように、単純なファクトリ パターンを使用してこのプロセスを実装する方法を見てみましょう:
このパターンの実装ソース コードは次のとおりです:
1.1.2.1 製品インターフェイス - フルーツ インターフェイス: Fruit .java
package com.lavasoft .patterns.simplefactory.ybgc;
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:Fruit.java
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 0:26:51
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書ノート
* ファクトリーモード モード – シンプル ファクトリーモード – 一般モード
* ReadMe: 抽象的な製品の役割: ファクトリーのフルーツ製品インターフェイス – フルーツ
*/
パブリックインターフェイス Fruit {
/**
*植栽
*/
void plant();
/**
*成長
*/
void give ();
/**
* 収穫
*/
void Harvest();
}
1.1.2.2 製品 - Pinguo カテゴリ: Apple.java
package com.lavasoft.patterns .simplefactory.ybgc;
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:Apple.java
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 0:47:25
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書ノート
* ファクトリーモードモード – シンプルファクトリーモード – 一般モード
* ReadMe: フルーツファクトリー製品: Apple
*/
public class Apple 実装 Fruit {
private inttreeAge;
/**
*植栽
*/
public void plant() {
System.out.println ("リンゴは植えられました。");
}
/**
*成長
*/
public void give() {
System.out.println("リンゴは成長しています...");
}
/**
* 収穫
}
/**
* @return ツリーの年齢を返します
public void setTreeAge(int TreeAge) {
this.treeAge = TreeAge;
}
}
1.1.2.3 产品-草莓类:Strawberry.java
package com.lavasoft.patterns.simplefactory.ybgc;
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:Strawberry.java
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 0:45:09
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* 工場モードモード – シンプル工場モード – 一般モード
* ReadMe: フルーツファクトリー製品: イチゴ
*/
public class Strawberry 実装 Fruit {
/**
*成長
*/
public void give() {
System.out.println("イチゴが成長しています...");
}
/**
* 収穫
*/
public void Harvest() {
System.out.println( "イチゴが収穫されました。");
}
/**
*植栽
*/
public void plant() {
System.out.println("イチゴが植えられました。");
}
/* *
* ヘルパーメソッド
*/
public static void log(String msg) {
System.out.println(msg);
}
}
1.1.2.4 产品-ブドウ类:Grape.java
package com.lavasoft .patterns.simplefactory.ybgc;
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:Grape.java
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 0:36:56
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* 工場モード モード – シンプル工場モード – 一般モード
* ReadMe: フルーツ工場の製品: ブドウ
*/
public class Grape は Fruit {
private boolean seedless; を実装します。 //否有籽
/**
*植栽
*/
public void plant() {
System.out.println("ブドウが植えられました。");
}
/**
*成長
*/
public void give() {
System.out.println("ブドウが育っています...");
}
/**
* 収穫
*/
public void Harvest() {
System.out.println( "ブドウが収穫されました。");
}
/**
* @return 種があるかどうか
*/
public boolean getSeedless() {
return seedless;
}
/**
※シードフリーの割り当て方法もあります
*/
public void setSeedless(booleanシードレス) {
{
this.seedless = シードレス;
/**
* ヘルパーメソッド
*/
public static void log(String msg) {
System.out.println(msg);
}
1.1.2.5 工厂-园丁类:FruitGardener.java
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:FruitGardener.java
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 1:03:27
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* 工場モード モード – シンプル工場モード – 一般モード
* ReadMe: 工場の役割: 果物の庭師、果物製品を生産します
*/
public class FruitGardener {
/**
* 静的ファクトリーメソッド
* @param の内容: 特定の製品名
* @フルーツオブジェクトを返す
* @throws BadFruitException
*/
public static Fruit Factory(String what) throws BadFruitException {
if (that.equalsIgnoreCase("apple")) {
new apple();
{} else {
to the slown、 - to .ybgc; //親クラスのコンストラクターを呼び出す
}
}
1.1.2.7 一般的なファクトリパターンテストクラス
package com.lavasoft.patterns.simplefactory.ybgc;
/**
* IntelliJ IDEA によって作成されました。 * ファイル名:BadFruitException.java
* ユーザー: LavaSoft
* 時刻: 1:04:56
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* ファクトリ モード - シンプル ファクトリ モード - 一般モード
* ReadMe: ファクトリ例外処理クラス
*/
publicクラスTestApp {
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:TestApp.java
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 1:12:08
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* ファクトリー モード モード – シンプル ファクトリー モード – 一般モード
* ReadMe: 一般ファクトリー モードのテスト クラス
private void test(String FruitName) {
Try {u u FRUIT F = FRUITGARDENER. FACTORY (FRUITNAME); System.out.println ("おめでとうございます! フルーツ オブジェクトが生成されました:" + FruitName); System.out.println (" 申し訳ございません。現在、工場ではご要望の製品を生産できません: " + FruitName); /**
* テスト方法
public static void main(String args []) {
TestApp t = new TestApp();
t.test("apple");
t.test("grape ");
t.test("strawberry");
t.test(" car"); //ここで例外がスローされます。果物工場は車を生産できますか? ハハハハ...
}
}
1.1.2.8 テスト実行の結果
おめでとうございます! フルーツ オブジェクトが生成されました: リンゴ
おめでとうございます! フルーツ オブジェクトが生成されました: イチゴ
申し訳ありませんが、現在工場ではこの製品を生産できません。欲しい: 車
悪いフルーツのリクエスト
com.lavasoft.patterns.simplefactory.ybgc.BadFruitException: 悪いフルーツのリクエスト
com.lavasoft.patterns.simplefactory.ybgc.FruitGardener.factory(FruitGardener.java:28)
com.lavasoft .patterns.simplefactory.ybgc.TestApp.test(TestApp.java:19)
、com.lavasoft.patterns.simplefactory.ybgc.TestApp.main(TestApp.java:37)
、sun.reflect.NativeMethodAccessorImpl.invoke0(Native) Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java: 585)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
ファクトリの役割:庭師
抽象的な製品: 果物インターフェイス
特定の製品: リンゴ、ブドウ、イチゴ
さらに、一般に
ファクトリ例外クラス
顧客クラス
を実装する必要があります。 単純なファクトリ パターンの一般的な構造図は次のとおりです。 :
は、さまざまな製品オブジェクトの作成を担当します。たとえば、java.text.DateFormat クラスはそのサブクラスのファクトリ クラスであり、DateFormat クラスは複数の静的ファクトリ メソッドを提供します。
システムに特定の製品の役割が 1 つだけある場合は、抽象的な製品の役割を省略できます。抽象的なプロダクト ロールを省略した簡略化されたクラス図は次のとおりです。
以下は例です。ファクトリ ロールは特定のプロダクトを作成します。ソース コードは次のとおりです。
1.1.4.3.1 Product役割: ConcreteProduct.javapackage com .lavasoft.patterns.simplefactory.gchb;
/**
* IntelliJ IDEA によって作成されました。
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 2:07:48
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書ノート
* ファクトリー パターン - 単純なファクトリー パターン - 作業描画マージャー (工場の役割と抽象的な製品の役割のマージ)
* ReadMe: 単一タイプの製品を示す特定の製品カテゴリー
*/
public class ConcreteProduct {
public ConcreteProduct() {
}
}
package com.lavasoft.patterns.simplefactory.gchb;
/**
* IntelliJ IDEA によって作成されました。
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 1:56:43
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* ファクトリー パターン - 単純なファクトリー パターン - 作業と描画のマージ (ファクトリー ロールと抽象製品ロールのマージ)
* ReadMe: 特定の製品カテゴリーは、単一タイプの製品のみを生産するために抽象的な製品ロールとマージされます
*/
public class Creator {
/**
* 静的ファクトリーメソッド
* @製品を返品する
*/
public static Creator Factory(){
return new Creator();
}
}
パッケージ com.lavasoft.patterns.simplefactory.gchb;
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:TestApp.java
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 2:11:30
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* ファクトリ パターン - 単純なファクトリ パターン - ワーカー マージャー (ファクトリ ロールと抽象プロダクト ロールのマージ)
* ReadMe: ワーカー マージャー テスト クラス
*/
public class TestApp {
private void test() {
Creator t = Creator.factory(); public static void main(String args[]) {
1.1.4.4ファクトリの役割が抽象的な役割と統合されました
場合によっては、ファクトリの役割を抽象的な製品の役割が果たすことができます。典型的なアプリケーションは、以下の図に示すように、サブクラスのファクトリーでもある抽象製品クラスである java.text.DateFormat クラスです。
1.1 .4.4.1 抽象プロダクト クラス (ファクトリ クラスでもあります)
package com.lavasoft.patterns.simplefactory.cxsl;/** * IntelliJ IDEA によって作成されました。
* ファイル名:AbsProduct.java
* 日付: 2006-12-3 * 時刻: 3:23:47
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書ノート* ファクトリ パターン - シンプルなファクトリ パターン - ファクトリの役割と抽象的な製品の役割の統合
* ReadMe: 抽象的な製品クラスとファクトリ クラスを同時に*/
public abstract class AbsProduct { static Product Factory(){
return new Product();
}
1.1.4.4.2 特定の製品カテゴリ
パッケージ com.lavasoft.patterns.simplefactory.cxsl;
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:Product.java
* ユーザー: LavaSoft
* 日付: 2006-12-3
* 時刻: 3:23:54
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書ノート
* ファクトリー パターン - 単純なファクトリー パターン - ファクトリーの役割と抽象的な製品の役割の融合
*/
パブリック クラス Product { Product(){
}
1.1.4.4.3 テスト クラス
package com.lavasoft.patterns.simplefactory.cxsl;
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:TestApp.java
* ユーザー: LavaSoft
* 日付: 2006-12-3
* 時刻: 3:30:30
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* ファクトリ パターン -- 単純なファクトリ パターン -- ファクトリ ロールと抽象プロダクト ロールのマージ
*/
public クラスTestApp { プライベート void test () {
Product a = AbsProduct.factory() System.out.println("製品オブジェクトが正常に作成されました!");
test.test();
}
}
1.1.4.4.4 テスト結果
製品オブジェクトが正常に作成されました。
終了コード0でプロセスが終了しました
この実装は非常に簡単なので、コードの詳細な説明は省略します。
1.1.4.5 3 つのロールすべてがマージされます
上記の例に基づく場合、抽象的なプロダクト ロールも省略され、ファクトリ ロールを特定のプロダクト ロールとマージできます。言い換えれば、製品クラスはそれ自体の工場です。以下の図に示すように:
1.1.4.5.1 特定の製品カテゴリ
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:ConcreteProduct.java
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 2:20:38
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* 工場モード - シンプルな工場モード - 3 色 1 つモード
* ReadMe: 抽象的な製品、製品、工場カテゴリ 3 つと特定の製品カテゴリ 1 つ
*/
public class ConcreteProduct
{
public ConcreteProduct(){}
/**
* 静的ファクトリメソッド
* @return 特定の製品 ConcreteProduct インスタンス
*/
public static ConcreteProduct Factory()
{
return new ConcreteProduct();
}
}
1.1.4.5.2 テストクラス
パッケージ com.lavasoft.patterns.simplefactory.sshb;
/**
* IntelliJ IDEA によって作成されました。
* ファイル名:TestApp.java
* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 2:24:22
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* ファクトリーモード - シンプルファクトリーモード - 3 色を 1 つのモードで
* ReadMe: テスト方法
*/
public class TestApp {
//テストメソッド
private void test () () {
ConcreteProduct T = ConcreteProduct.factory ();
System.out.println ("製品の生産が成功しました!") .test();
}
}
1.1.4.5.3 テスト実行結果
1.1.4.6 ここでは、プロダクトオブジェクトと登録されたファクトリメソッド
の循環使用について、シングルケースモードとマルチケースモードで説明します。シンプル ファクトリ パターンの長所と短所
1.1.4.6.1 シンプル ファクトリ パターンの利点
1.1.4.6.2 単純なファクトリ パターンの欠点
このファクトリー クラスには、すべての製品作成ロジックが集約されており、すべてを知っている全能のクラス (神クラスとも呼ばれます) が形成されます。このクラスに問題が発生すると、アプリケーション全体に大きな影響が及びます。
製品に複数のインターフェースがある場合、どの条件でどの製品クラスのインスタンスを作成するかを決定するのが難しい場合があります。工場にとって、新しい製品を追加するのは骨の折れるプロセスです。工場の役割は、各製品、その作成方法、およびそれらをいつ顧客に提供するかを知っている必要があります。つまり、新しい製品を受け入れるということは、このファクトリ ロールのソース コードを変更することを意味します。単純な工場は、限られた範囲でのみ、開閉原則をサポートします。
シンプルファクトリパターンはファクトリメソッドとして静的メソッドを使用しており、静的メソッドをサブクラスに継承できないため、ファクトリロールは継承による階層構造を形成できません。この欠点はファクトリ メソッド パターンで克服されます。
1.1.4.7 Java の単純なファクトリ パターンのアプリケーション
XMLReaderFactory と SAX2 ライブラリの単純なファクトリ パターン
1.1.4.8 Nuwa は粘土から人を作ります