23种设计模式(1) - 工厂方法模式

1、定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

2、举例

有一个Animal接口,有两个类DogCat分别继承了该接口。我们通过一个叫AnimalDactory的工厂类接口,再定义DogFactoryCatFactory类来分别创建DogCat实例,由调用端来决定使用哪个工厂来创建对象。

8fHV6x.png

3、代码

// 创建 动物 接口
public interface Animal {
    void sayName();
}

// 创建 猫和狗 类
public class Cat implements Animal {
    @Override
    public void sayName() {
        System.out.println("我是猫!");
    }
}
public class Dog implements Animal {
    @Override
    public void sayName() {
        System.out.println("我是狗!");
    }
}

// 创建工厂接口类
public interface IAnimalFactory {
    Animal createAnimal();
}
// 分别创建生成猫和狗 的工厂类
public class CatFactory implements IAnimalFactory{
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}
public class DogFactory implements IAnimalFactory{
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}


// 客户端使用工厂类来创建动物对象
public class Main {
    public static void main(String[] args) {
      	// 分别获得生产猫和狗的工厂类
        IAnimalFactory catFacroty = new CatFactory();
        IAnimalFactory dogFacroty = new DogFactory();

        Animal cat = catFacroty.createAnimal();
        Animal dog = dogFacroty.createAnimal();

        cat.sayName();
        dog.sayName();
    }
}

下面是运行的结果:

我是猫!
我是狗!

4、优点

工厂模式分为 简单工厂模式工厂方法模式简单方法模式中的工厂方法一般是静态的,不会有接口,而且一个工厂可以创建多个实例,代码如下:

// 简单工厂模式的工厂
public class AnimalFactory implements IAnimalFactory{
    @Override
    public Animal createAnimal(String name) {
      	// 通过 if 判断,生成多中不同的实例
        if("cat".equals(name)){
            return new Cat();
        }
        if("dog".equals(name)){
            return new Dog();
        }
        throw new RuntimeException("无此类动物:" + name);
    }
}

而在工厂方法模式中,会有工厂接口,而且针对不同的实例,会有多个工厂类。

大家看到这里会发现,简单工厂模式比起工厂方法模式来说,简洁的多(因为没有多个工厂类)。但是,在简单工厂模式中,工厂类包含了判断逻辑,如果我们要添加一个新的Animal类,需要修改原来工厂类的方法,这样我们不但对拓展开放了,对修改也开放了,违背了 开放-封闭原则。而如果使用工厂方法模式,我们只需要增加一个新的工厂就能实现功能拓展,而不要去修改原来的代码。

从根本上说,这两种模式都存在判断的问题。简单工厂模式是把判断逻辑放到了工厂的方法中,工厂方法模式则把判断逻辑放在调用端,由调用端来判断该使用哪个工厂类,这样想要加新功能时,只需要修改调用端就行,而不是工厂类。

5、适用场景

  • 工厂模式屏蔽了创建类的内部细节,降低了调用类之间的耦合度。
  • 如果一个类的创建流程比较复杂,使用工厂类可以有效的降低系统复杂度。
  • 工厂模式依靠抽象架构,具有较好的拓展性。
posted @ 2020-03-22 00:48  MoonGeek  阅读(240)  评论(0编辑  收藏  举报