JAva設計モード:3つの工場モードの比較

7921 ワード

JAva設計モード:3つの工場モードの比較
単純ファクトリモード
基礎工場クラスを実現し、この工場クラスの異なるパラメータに基づいて、異なる具体的な製品クラスにマッチングします.コードは次のとおりです.
public class AnimalFactory {
    public Animal getAnimal(String name)
    {
        switch(name.toLowerCase())
        {
            case "cow":
                return new Cow();
            case "horse":
                return new Horse();
            case "dog":
                return new Dog();
        }
        return null;
    }

        public static void main(String args[])
        {
            AnimalFactory f = new AnimalFactory();
            Animal c =  f.getAnimal("cow");
            Animal h =  f.getAnimal("horse");
            Dog d = (Dog)f.getAnimal("dog");
            c.eat();
            h.eat();
            d.eat();

###特徴:1.新しい製品を追加するには、*特定の製品クラスを追加抽象的な製品クラスを継承する*製品工場クラスは、新しい製品と一致するためにcaseを追加する必要があります : , , name
  • 具体的な製品に業務を追加する手順(変更が少し面倒です):
  • 抽象クラスまたはインタフェースを変更しない場合:1.具体的な実装クラスに新しい方法を加えると、クライアント実装は抽象オブジェクトを強制的に具体的なオブジェクトクラス
  • に変換する必要がある.
  • 抽象クラスまたはインタフェースを変更する:1.クラスまたはインタフェースを継承するすべての具体的な実装クラスは、この方法を加えなければならない.

  • ファクトリメソッドモード
    工場抽象クラスやインタフェースを書き、具体的な業務工場で継承し、業務変動を直接業務工場で修正し、親インタフェースの圧力を分散させる.コードは次のとおりです.
    public interface AnimalFactory1 {
        public Animal getAnimal();
    }
    
    public class DogFactory implements AnimalFactory1{
        @Override
        public Dog getAnimal() {
            return new Dog();
        }
    }
    
    public static void main(String[] args) {
       DogFactory dogFactory = new DogFactory();
       Dog d = dogFactory.getAnimal();
       d.eat();
    }

    ###特徴:1.製品を追加するには*特定の製品クラス継承抽象製品クラスを追加*特定の工場クラス継承抽象工場クラスを追加*クライアントリファレンス:新しい工場クラスをインスタンス化し、対応するメソッドを呼び出します.
  • 特定の製品にビジネスを追加する手順(簡単):
  • 対応する製品実装クラスに直接新しい業務方法を追加すれば
  • である.
  • 個別のタイプの工場を追加します:例えばColor
  • はColor抽象クラスを実現し、以下の具体的な圧色クラス
  • を実現する.
  • ColorFactoryを追加し、DogFactoryでColorFactoryというインタフェースを継承します.どうせインタフェースは複数の
  • を継承できます.
  • それからDogFactoryを通じてそれぞれ2つの製品のgetを実現すればいい
  • 直接インスタンス化業務工場類であれば、なぜ製品類を直接インスタンス化しないのですか?
  • デカップリング、クライアントは工場の方法の結果に注目するだけで、後の業務実現に関心を持つ必要はなく、業務更新時に適用者の変更に影響を与えないことを保障することができる
  • .

    抽象ファクトリモード
    個人的には、抽象工場と工場の方法モデルの差は多くありませんが、ここでは2つのモデルの対比を書きます.抽象ファクトリは,1つのオブジェクトに複数の属性ファクトリが存在する場合を解決するためである.
    次にPetを例に挙げます.Petにはdog、catなど、異なる種類があります.Petには黒、白、灰など、異なる色があります.
  • 工場方法モード
  • public interface PetFactory {
        public Pet getAnimal();
    }
    public interface ColorFactory {
        public Color getColor();
    }
    
    public class DogFactory implements PetFactory,ColorFactory{
        @Override
        public Dog getAnimal() {
            return new Dog();
        }
        @Override
        public Color getColor() {
            return new Red();
        }
    }
    
    public class MainApp {
        public static void main(String[] args) {
            DogFactory dogFactory = new DogFactory();
            Dog d = dogFactory.getAnimal();
            d.eat();
            Color color = dogFactory.getColor();
            color.color();
        }
    }
  • 抽象工場モード
  • public interface AbstractFactory {
        public Pet getPet();
        public Color getColor();
    }
    
    public class DogFactory implements AbstractFactory {
        @Override
        public Pet getPet() {
            return new Dog();
        }
        @Override
        public Color getColor() {
            return new Red();
        }
    }
    
    public class MainApp {
        public static void main(String[] args) {
            DogFactory dogFactory = new DogFactory();
            Dog d = dogFactory.getPet();
            d.eat();
            Color c = dogFactory.getColor();
            c.color();
        }
    }
    , , 。 , , , 。
  • の例はわかりませんが、工場メソッドモデルが2つの抽象クラスを継承するのが抽象工場モデルではないでしょうか.二つのパターンの差が少ないような気がします~
  • 初心者が出発するなら,もっと指摘してください.読んでくれてありがとう