[Pattern] Factory Method


工場方法モデルは?


ファクトリメソッドモードは、オブジェクトファクトリを作成する設計モードであり、どのオブジェクトを作成するかをサブクラスで決定します.
インタフェースを定義して
  • オブジェクトを作成しますが、どのインスタンスを作成するかを決定するモードは
  • で、このインスタンスはサブクラスによってダウングレードされます.
  • サブクラスでは、ファクトリメソッドoverrideによってオブジェクトのモードが返される.
  • 使用する理由

  • クラスが作成するオブジェクトのクラスを予測できない場合、
  • サブクラスが作成するオブジェクトの説明を担当する場合は、
  • を指定します.
  • オブジェクトを作成する責任は、いくつかの補助サブクラスの1つに委任され、どのサブクラスが委任者であるかに関する情報をローカライズする必要がある場合、
  • が呼び出されます.

    工場メソッド構造



    Product

  • ファクトリメソッドで生成されたオブジェクトのインタフェースを定義します.
  • ConcreteProduct

  • クラス
  • は、実際に製品クラスで定義されたインタフェースを実現しています.

    Creator

  • クラス
  • ファクトリメソッドを宣言し、製品タイプのオブジェクトを返します.
    デフォルトでは、
  • ファクトリメソッドが実装され、特定の製品オブジェクトが返されます.
  • 工場メソッドを呼び出して
  • 製品オブジェクトを生成します.
  • ConcreteCreator

  • ファクトリメソッドを再定義し、顧客製品インスタンス
  • に戻ります.

    実施上の注意


    工場メソッドモデルの実現方法は大体2種類ある

  • Creatorは抽象クラスとして定義され、ファクトリメソッドは抽象として宣言されます.
  • Creatorは具体的なクラスであり、工場方法の基本的な実施
  • をどのように提供するか.

    ファクトリメソッドのパラメータにより、複数の製品を生成できます。

  • ファクトリメソッドに誤ったパラメータが導入された場合、実行時のエラー処理に悩む
  • Enumなども考慮する必要があります.
  • メリットとデメリット


    長所

  • オブジェクトを生成するコードは、動作コードから分離されてもよい.

  • アーチェリー戦士開始力/敏捷100/100/100アップグレード時に増加する力/敏捷10/30/10
  • アーチェリーと戦士役があります.
  • レベルのアップグレード時に2つの職業間の差異が発生しないように、異なるクラスで2つのクラスが作成されます.
    これらのプロセスで新しいロールをインスタンス化する場合は、ファクトリモードを使用して構成します.

  • GOFは、特定のクラスの親であり、製品タイプを返すファクトリメソッド(abstract method)を持つClassCreator抽象クラスを記述します.CharacterCreatorConcreteCreatorファクトリメソッドを再定義することで、特定のクラス(ConcreteProduct)を返します.WarriorCreatorArcherCreatorProductファクトリメソッドが返すクラスの抽象クラス.CharacterConcreteProductクラスで定義されたメソッドの具体的なクラスが実装されています.WarriorArcher

    コード#コード#

    Character.java
    package Velog;
    
    public abstract class Character {
    
        protected int STR;
        protected int DEX;
    
        public abstract void levelUp();
    
        public int getSTR() {
            return STR;
        }
    
        public void setSTR(int STR) {
            this.STR = STR;
        }
    
        public int getDEX() {
            return DEX;
        }
    
        public void setDEX(int DEX) {
            this.DEX = DEX;
        }
    }
    
    Archer.java
    package Velog;
    
    public class Archer extends Character {
        @Override
        public void levelUp() {
            this.STR += 10;
            this.DEX += 30;
        }
    }
    
    Warrior.java
    package Velog;
    
    public class Warrior extends Character {
    
        @Override
        public void levelUp() {
            this.STR += 30;
            this.DEX += 10;
        }
    }
    
    CharacterCreator.java
    package Velog;
    
    public abstract class CharacterCreator {
    
        public Character CharacterCreator() {
            final Character character = character();
    
            character.setDEX(100);
            character.setSTR(100);
    
            return character;
        }
    
    
        protected abstract Character character();
    }
    
    ArcherCreator.java
    package Velog;
    
    public class ArcherCreator extends CharacterCreator{
        @Override
        protected Character character() {
            return new Archer();
        }
    }
    
    warriorCreator.java
    package Velog;
    
    public class WarriorCreator extends CharacterCreator{
        @Override
        protected Character character() {
            return new Warrior();
        }
    }