blog

デザインパターン(II)-ファクトリーパターンの作成

ファクトリーパターンには、1.シンプルファクトリーパターン 2.ファクトリーメソッド 3.抽象ファクトリーパターンの3種類がありますが、この記事では3種類のファクトリーパターンの違いと書き方を紹介しま...

Aug 2, 2020 · 8 min. read
シェア

説明

ファクトリーパターンには、1.シンプルファクトリーパターン 2.ファクトリーメソッド 3.抽象ファクトリーパターンの3種類がありますが、今回は3種類のファクトリーパターンの違いと書き方を紹介します。

定義

  • 定義:オブジェクトを生成するためのインターフェースを定義しますが、どのクラスをインスタンス化するかは、そのインターフェースを見たクラスに任せます。 ファクトリーメソッドによって、クラスのインスタンス化をサブクラスに先送りすることができます。
  • タイプ: 作成

シナリオ

  • オブジェクトの作成には多くの反復コードが必要
  • クライアントは、製品クラスのインスタンスがどのように作成され、実装されるかなどの詳細には依存しません。
  • クラスは、そのサブクラスを通じてどのオブジェクトを作成するかを指定します。

利点

  • ユーザーは、製品の対応する工場に関連付けるだけでよく、作成の詳細を気にする必要はありません。
  • 新商品の追加は開店・閉店の原則に沿い、拡張性を向上

デメリット

  • クラスが多すぎると複雑になりがちです。
  • 抽象度が高まり、システムの理解が困難に

ファクトリーパターンにおける役割

シンプルファクトリーの役割説明

  • 製品
    • Product ロールはフレームハウスに属し、creation クラスを具体的に抽象化した抽象クラスです。
  • コンクリート製品
    • ConcreteCreatorロールは、実際の工場によって作成された実際の製品である特定の実際のプロセッサに属します。
  • ConcreteCreator (実際の作成者)
    • ConcreteCreatorロールは、実際の製品を生産する責任を負う実際の加工側に属します。

単純なファクトリーのクラス図

ファクトリー メソッド 役割 説明

  • 製品
    • Product ロールはフレームハウスに属し、creation クラスを具体的に抽象化した抽象クラスです。
  • クリエイター
    • Creatorロールは、Productロールの生成を担当する抽象クラスであるフレームハウスに属しますが、具体的な処理はサブクラスConcreteCreatorロールによって決定されます。
  • コンクリート製品
    • ConcreteCreatorロールは、実際の工場によって作成された実際の製品である、特定の実際のプロセッサに属します。
  • ConcreteCreator (実際の作成者)
    • ConcreteCreatorロールは、実際の製品を生産する責任を負う実際の加工側に属します。

ファクトリーメソッドのクラス図

抽象化ファクトリーの役割説明

  • AbstractProduct(抽象製品)
    • AbstractProductロールは、AbstractFactoryロールが生成する抽象部品および製品インタフェースの定義を担当します。
  • AbstractFactory(抽象ファクトリー)
    • AbstractFactoryロールは、抽象製品の生成に使用されるインタフェースの定義を担当します。
  • コンクリート製品(実際の製品)
    • ConcreteProductロールは、AbstractProductロールのインタフェースの実装を担当します。
  • ConcreteFactory(実際の工場)
    • ConcreteFactoryロールは、AbstractFactoryロールのインターフェースの実装を担当します。

抽象ファクトリーのクラス図

実装コード

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

最初のステップは、役割のProductに対応するBookインターフェースを書くことです。

public interface Book {
 /**
 *  
 */
 void read();
}

2番目のステップは、ConcreteProductの役割に対応するBookの実装クラスJavaBookを書くことです。

public class GoBook implements Book{
 @Override
 public void read() {
 System.out.println("初心者からマスターになるための囲碁の本を書く");
 }
}

ステップ 3: Book クラスの別の実装 PythonBook を書きます。

public class GoBook implements Book{
 @Override
 public void read() {
 System.out.println("初心者からマスターになるための囲碁の本を書く");
 }
}

ステップ4: シンプルなファクトリークラスを書く

public class BookFactory {
 private final String javaBook = "java";
 private final String goBook = "go";
 public Book createBook(String name) {
 if (javaBook.equalsIgnoreCase(name)) {
 return new JavaBook();
 }else if (goBook.equalsIgnoreCase(name)){
 return new GoBook();
 }else {
 return null;
 }
 }
}

最後に、シンプルなファクトリーテストクラスを書きます。

public class SimpleFactoryTest {
 public static void main(String[] args) {
 BookFactory bookFactory = new BookFactory();
 Book javaBook = bookFactory.createBook("java");
 javaBook.read();
 }
}

シンプルなファクトリーパターンの実装結果

簡単な工場試験結果の実行

簡単なファクトリーの書き方 II

単純な工場は、増加の本を書くために、たびに、製品の増加に応じてコードのロジックを変更する必要がある、オープンとクローズの原則に準拠していませんので、最適化コードを最適化するために反射を使用することができます最初の3つのステップのコードを最適化する同じですが、工場メソッドの実装の4番目のステップに直接ジャンプする別の方法を達成するために工場メソッドの知識

public class BookFactory {
 public Book createBook(String className) {
 try {
 if (className != null && className.length() > 0) {
 return (Book) Class.forName(className).newInstance();
 }
 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
 e.printStackTrace();
 }
 return null;
 }
}

ステップ5、同じクラスのシンプル・ファクトリー・ライトアップIIテスト実装

public class SimpleFactoryTest {
 public static void main(String[] args) {
 BookFactory bookFactory = new BookFactory();
 Book javaBook = bookFactory.createBook(JavaBook.class.getName());
 javaBook.read();
 }
}

簡易工場書き込み II の実行結果

シンプルなファクトリーのwrite 2はwrite 1と同じ結果を実行しますが、write 2はopenとcloseの原則に準拠していることがわかります。

ファクトリーメソッド

ファクトリーメソッドパターンの最初の3つのステップは単純なファクトリーパターンと同じなので、ここでは詳細を繰り返しません。4つ目のステップは、Creatorの役割であるBookFactoryインターフェースを宣言することです。

public interface BookFactory {
 Book create();
}

ステップ5:役割のConcreteCreatorであるJavaBookFacotoryを実装します。

public class JavaBookFactory implements BookFactory {
 @Override
 public Book create() {
 return new JavaBook();
 }
}

ステップ 6: 別の GoBookFactory を実装します。

public class GoBookFactory implements BookFactory {
 @Override
 public Book create() {
 return new GoBook();
 }
}

ステップ 7: ファクトリーメソッドのテストクラスの完成

public class FactoryMethodTest {
 public static void main(String[] args) {
 BookFactory javaBookFactory = new JavaBookFactory();
 Book javaBook = javaBookFactory.create();
 javaBook.read();
 System.out.println("
"+"========== ========="+"
");
 BookFactory goBookFactory = new GoBookFactory();
 Book goBook = goBookFactory.create();
 goBook.read();
 }
}

ファクトリーメソッドパターンの実装結果

抽象ファクトリーパターン

たとえば、本を読んで、ノートとして記録された知識を学びますが、ノートは本のノート、ノートブックに記録されたノートや学習ノートのコンピュータなど、いくつかの部分が含まれている可能性があります。最初のステップは、クラス図内のAbstractProductの役割であるBookNote、Note、ENoteインタフェースまたは抽象クラスを作成することです。

public interface ENote {
 void typing();
}
public interface BookNote {
 void mark();
}
public interface Note {
 void write();
}

このクラスは、クラス図では ConcreteProduct ロールとなります。

public class JavaBookNote implements BookNote{
 @Override
 public void mark() {
 System.out.println("初心者からマスターになるためのJavaの一節をマークした!");
 }
}
public class JavaENote implements ENote{
 @Override
 public void typing() {
 System.out.println("コンピューター上でjavaノートをノックアップした");
 }
}
public class JavaNote implements Note {
 @Override
 public void write() {
 System.out.println("ノートにjavaのメモを書いた");
 }
}
public class GoBookNote implements BookNote{
 @Override
 public void mark() {
 System.out.println("ビギナーからマスターへ!」の一節に印をつける);
 }
}
public class GoENote implements ENote{
 @Override
 public void typing() {
 System.out.println("コンピューターで碁盤ノートをノックアップした");
 }
}
public class GoNote implements Note {
 @Override
 public void write() {
 System.out.println("ノートに囲碁のメモを書いた");
 }
}

これは、クラス図の AbstractFactory の役割です。

public interface NoteFactory {
 /**
 * ブックノートを作成する
 * @return
 */
 BookNote createBookNote();
 /**
 * eノートを作成する
 * @return
 */
 ENote createENote();
 /**
 * ノートブックのノートを作成する
 * @return
 */
 Note createNote();
}

このクラスは、クラス図では ConcreteFactory ロールとなります。

public class JavaNoteFactory implements NoteFactory{
 @Override
 public BookNote createBookNote() {
 return new JavaBookNote();
 }
 @Override
 public ENote createENote() {
 return new JavaENote();
 }
 @Override
 public Note createNote() {
 return new JavaNote();
 }
}
public class GoNoteFactory implements NoteFactory{
 @Override
 public BookNote createBookNote() {
 return new GoBookNote();
 }
 @Override
 public ENote createENote() {
 return new GoENote();
 }
 @Override
 public Note createNote() {
 return new GoNote();
 }
}

ステップ 5: 抽象ファクトリテストクラスの作成

public class AbstractFactoryTest {
 public static void main(String[] args) {
 NoteFactory javaNoteFactory = new JavaNoteFactory();
 
 BookNote javaBookNote = javaNoteFactory.createBookNote();
 ENote javaENote = javaNoteFactory.createENote();
 Note javaNote = javaNoteFactory.createNote();
 
 javaBookNote.mark();
 javaENote.typing();
 javaNote.write();
 System.out.println("
"+"========== ========="+"
");
 NoteFactory goNoteFactory = new GoNoteFactory();
 
 BookNote goBookNote = goNoteFactory.createBookNote();
 ENote goENote = goNoteFactory.createENote();
 Note goNote = goNoteFactory.createNote();
 
 goBookNote.mark();
 goENote.typing();
 goNote.write();
 
 }
}

Read next

職場でのIMインスタントメッセージの役割

インスタントメッセージは、しばしばIMと呼ばれ、電子メールに似たオンラインコミュニケーション方法です。IMは特別なソフトウェアプログラムを必要とします。これらのプログラムを使用すると、ダイアログボックスに言いたいことを入力すると、友人はほとんどすぐにそれを見ることができます...

Aug 2, 2020 · 3 min read