設計模式之簡單工廠模式

1.定義

屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。

2.簡單工廠模式結構

簡單工廠模式包含如下角色:

  • Factory:工廠角色

    工廠角色負責實現創建所有實例的內部邏輯。例子中的SimpleAnimalFactory

    /**
     * 簡單工廠
     */
    public class SimpleAnimalFactory {
        /**
         * 第一種方法
         * @param animalTypeEnum
         * @return
         */
        public static Animal createAnimal(AnimalTypeEnum animalTypeEnum) {
            Animal animal = null;
            switch (animalTypeEnum) {
                case Cat: animal = new Cat();
                break;
                case Dog: animal = new Dog();
                break;
                case Bird: animal = new Bird();
                break;
            }
            return animal;
        }
    
    
        /**
         * 第二種方法(jdk8)
         */
        private static Map<AnimalTypeEnum, Supplier<Animal>> map = new HashMap<>();
        static {
            map.put(AnimalTypeEnum.Bird,Bird::new);
            map.put(AnimalTypeEnum.Cat,Cat::new);
            map.put(AnimalTypeEnum.Dog,Dog::new);
        }
    
        public static Animal createAnimal2(AnimalTypeEnum animalTypeEnum) {
            return map.get(animalTypeEnum).get();
        }
    
        public static void main(String[] args) {
            Animal animal = SimpleAnimalFactory.createAnimal(AnimalTypeEnum.Dog);
            animal.say();
    
            Animal animal2 = SimpleAnimalFactory.createAnimal2(AnimalTypeEnum.Cat);
            animal2.say();
        }
    
    
    }
    
    public enum AnimalTypeEnum {
        Bird("bird"),
        Cat("cat"),
        Dog("dog");
        private String type;
    
        AnimalTypeEnum(String type) {
            this.type = type;
        }
    
        public String getType() {
            return type;
        }
    }
  • Product:抽象產品角色

    抽象產品角色是所創建的所有對象的父類,負責描述所有實例所共有的公共接口。例子中的Animal

    public abstract class Animal {
        abstract public void say();
    }
  • ConcreteProduct:具體產品角色

    具體產品角色是創建目標,所有創建的對象都充當這個角色的某個具體類的實例。例子中的bird、dog、cat

    public class Bird extends Animal {
        @Override
        public void say() {
            System.out.println("咕咕咕");
        }
    }
    
    public class Cat extends Animal {
        @Override
        public void say() {
            System.out.println("喵喵喵");
        }
    }

    public class Dog extends Animal {
        @Override
        public void say() {
            System.out.println("汪汪汪");
        }
    }

3.簡單工廠模式分析

將對象的創建和對象本身業務處理分離可以降低系統的耦合度,使得兩者修改起來都相對容易。

簡單工廠模式最大的問題在於工廠類的職責相對過重,增加新的產品需要修改工廠類的判斷邏輯,這一點與開閉原則是相違背的。

簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章