Java デザイン パターン シンプル ファクトリ パターン

高洛峰
リリース: 2016-12-15 14:16:52
オリジナル
1722 人が閲覧しました

1.1 シンプル ファクトリ パターン


シンプル ファクトリ パターンはクラスの作成であり、静的ファクトリ メソッド パターンとも呼ばれます。単純なファクトリ パターンでは、ファクトリ オブジェクトを使用して、製品クラスのどのインスタンスを作成するかを決定します。

1.1.1 ファクトリ パターンのいくつかの形式


ファクトリ パターンは、特に、共通のインターフェイスを持つ多数のクラスをインスタンス化する役割を果たします。ファクトリ パターンは、どのクラスをインスタンス化するかを動的に決定できます。 ファクトリ パターンには次の形式があります:
 シンプル ファクトリ (シンプル ファクトリ) パターン: 静的ファクトリ メソッド (静的ファクトリ メソッド) パターンとも呼ばれます。
 ファクトリ メソッド パターン: ポリモーフィック ファクトリ パターンまたは仮想コンストラクタ パターンとも呼ばれます。
 抽象ファクトリー パターン: ツールボックス (キットまたはツールキット) パターンとも呼ばれます。
下の図は、単純なファクトリ パターンの簡略化されたクラス図を示しています。

Java デザイン パターン シンプル ファクトリ パターン

単純なファクトリ パターン、または静的なファクトリ メソッド パターンは、さまざまなファクトリ メソッド パターンの特別な実装です。 Java言語では、通常のファクトリメソッドパターンではデザイン機能を縮退させて静的ファクトリメソッドパターンを与えることができません。

1.1.2 簡易工場モード(一般モード)の導入
たとえば、リンゴ、イチゴ、ブドウなどのさまざまな果物を生産する農場があるとします。 、対応する果物が提供されます。以下に示すように、単純なファクトリ パターンを使用してこのプロセスを実装する方法を見てみましょう:

Java デザイン パターン シンプル ファクトリ パターン

このパターンの実装ソース コードは次のとおりです:

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

package com.lavasoft.patterns.simplefactory.ybgc;🎜

/**
* 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

* 日付: 2006-12-1

* 時刻: 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)

終了コード 0 でプロセスが終了しました


結果から、タイプ car であるため例外が発生しているようです工場では生産できないものが入っています(車)、はははは、果樹園で車を生産できますか?幼稚園児たちに教えてもらいましょう!

1.1.3 単純なファクトリ パターンの一般的な構造


要約すると、上記の単純なファクトリ パターンの実装から、単純なファクトリ パターンを実装する必要があることがわかります

 ファクトリの役割:庭師
 抽象的な製品: 果物インターフェイス
 特定の製品: リンゴ、ブドウ、イチゴ
さらに、一般に
 ファクトリ例外クラス
 顧客クラス
を実装する必要があります。 単純なファクトリ パターンの一般的な構造図は次のとおりです。 :

Java デザイン パターン シンプル ファクトリ パターン

1.1.4 単純なファクトリ パターンの実装

1.1.4.1 インターフェイスまたは抽象クラスを使用して、マルチレベルのプロダクト構造を実装します

ファクトリ クラスは、さまざまなプロダクトを生成するために使用される複数の静的ファクトリ メソッドを持つことができますオブジェクト。

1.1.4.2 複数のファクトリ メソッド

は、さまざまな製品オブジェクトの作成を担当します。たとえば、java.text.DateFormat クラスはそのサブクラスのファクトリ クラスであり、DateFormat クラスは複数の静的ファクトリ メソッドを提供します。


1.1.4.3 抽象的な製品の役割の省略

システムに特定の製品の役割が 1 つだけある場合は、抽象的な製品の役割を省略できます。抽象的なプロダクト ロールを省略した簡略化されたクラス図は次のとおりです。


以下は例です。ファクトリ ロールは特定のプロダクトを作成します。ソース コードは次のとおりです。 Java デザイン パターン シンプル ファクトリ パターン

1.1.4.3.1 Product役割: ConcreteProduct.java

package com .lavasoft.patterns.simplefactory.gchb;

/**
* IntelliJ IDEA によって作成されました。

* ファイル名:ConcreteProduct.java

* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 2:07:48
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書ノート
* ファクトリー パターン - 単純なファクトリー パターン - 作業描画マージャー (工場の役割と抽象的な製品の役割のマージ)
* ReadMe: 単一タイプの製品を示す特定の製品カテゴリー
*/
public class ConcreteProduct {
public ConcreteProduct() {
}
}


1.1.4.3. 2 ファクトリの役割:

package com.lavasoft.patterns.simplefactory.gchb;

/**
* IntelliJ IDEA によって作成されました。

* ファイル名:Creator.java

* ユーザー: LavaSoft
* 日付: 2006-12-1
* 時刻: 1:56:43
* 「Java とパターン」 (--Dr. Yanホン (著者) 読書メモ
* ファクトリー パターン - 単純なファクトリー パターン - 作業と描画のマージ (ファクトリー ロールと抽象製品ロールのマージ)
* ReadMe: 特定の製品カテゴリーは、単一タイプの製品のみを生産するために抽象的な製品ロールとマージされます
*/
public class Creator {
/**
* 静的ファクトリーメソッド
* @製品を返品する
*/
public static Creator Factory(){
return new Creator();
}
}


1.1.4.3.3 テストクラス

パッケージ 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

* ユーザー: LavaSoft

* 日付: 2006-12-3Java デザイン パターン シンプル ファクトリ パターン * 時刻: 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ホン (著者) 読書ノート
* ファクトリー パターン - 単純なファクトリー パターン - ファクトリーの役割と抽象的な製品の役割の融合

* ReadMe: 特定の製品カテゴリ

*/

パブリック クラス 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ホン (著者) 読書メモ
* ファクトリ パターン -- 単純なファクトリ パターン -- ファクトリ ロールと抽象プロダクト ロールのマージ

* ReadMe: テスト クラス

*/

public クラスTestApp {

プライベート void test () {
Product a = AbsProduct.factory() System.out.println("製品オブジェクトが正常に作成されました!");

public static void main(String args[]) {テストアプリtest = new TestApp();

test.test();
}
}





1.1.4.4.4 テスト結果


製品オブジェクトが正常に作成されました。

終了コード0でプロセスが終了しました



この実装は非常に簡単なので、コードの詳細な説明は省略します。

1.1.4.5 3 つのロールすべてがマージされます

上記の例に基づく場合、抽象的なプロダクト ロールも省略され、ファクトリ ロールを特定のプロダクト ロールとマージできます。言い換えれば、製品クラスはそれ自体の工場です。以下の図に示すように:


簡単な実装例を以下に示します:


1.1.4.5.1 特定の製品カテゴリ

package com.lavasoft.patterns.simplefactory.sshb;

/**
* 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 テスト実行結果

製品は正常に生成されました!

終了コード 0 でプロセスは終了しました


コードは非常に簡単なので説明は省略します。


1.1.4.6 ここでは、プロダクトオブジェクトと登録されたファクトリメソッド

の循環使用について、シングルケースモードとマルチケースモードで説明します。

シンプル ファクトリ パターンの長所と短所



1.1.4.6.1 シンプル ファクトリ パターンの利点

コア ファクトリ クラス、ファクトリ クラスは、プロダクト クラスのどのインスタンスがどのような状況で作成されるかを決定します。一方、クライアントは製品オブジェクトを直接作成する責任を免除され、製品を「消費」するだけです。シンプルなファクトリー パターンは、このアプローチを通じて責任の分離を実現します。


1.1.4.6.2 単純なファクトリ パターンの欠点

プロダクト クラスが複雑な多レベルの階層構造を持つ場合、ファクトリ クラスはそれ自体のみを持ちます。欠点は、変化しないままですべての変化に適応できることです。

このファクトリー クラスには、すべての製品作成ロジックが集約されており、すべてを知っている全能のクラス (神クラスとも呼ばれます) が形成されます。このクラスに問題が発生すると、アプリケーション全体に大きな影響が及びます。

製品に複数のインターフェースがある場合、どの条件でどの製品クラスのインスタンスを作成するかを決定するのが難しい場合があります。

工場にとって、新しい製品を追加するのは骨の折れるプロセスです。工場の役割は、各製品、その作成方法、およびそれらをいつ顧客に提供するかを知っている必要があります。つまり、新しい製品を受け入れるということは、このファクトリ ロールのソース コードを変更することを意味します。単純な工場は、限られた範囲でのみ、開閉原則をサポートします。
シンプルファクトリパターンはファクトリメソッドとして静的メソッドを使用しており、静的メソッドをサブクラスに継承できないため、ファクトリロールは継承による階層構造を形成できません。この欠点はファクトリ メソッド パターンで克服されます。



1.1.4.7 Java の単純なファクトリ パターンのアプリケーション

DateFormat と単純なファクトリ パターン

XMLReaderFactory と SAX2 ライブラリの単純なファクトリ パターン



1.1.4.8 Nuwa は粘土から人を作ります

Nuwa は人を作る必要があります粘土で人を 1 人ずつ生成します。これは単純な工場パターンの適用です。クラス図は次のとおりです。


Nuwa は工場の役割、人は抽象的な製品の役割、Zhang San と Li Si は製品です。 。ここでは具体的な実装については説明しません。果物を生産する庭師の例を参照してください。

Java デザイン パターン シンプル ファクトリ パターン


その他の Java デザイン パターンのシンプル ファクトリ パターン関連記事については、PHP 中国語 Web サイトに注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!