设计模式之简单工厂模式

Posted by zhangtao on Tuesday, February 25, 2020

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.简单工厂模式分析

将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。

简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。

简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。