23种设计模式(1) - 工厂方法模式
1、定义
定义一个用于创建对象的接口
,让子类
决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
2、举例
有一个Animal
接口,有两个类Dog
和Cat
分别继承了该接口。我们通过一个叫AnimalDactory
的工厂类接口,再定义DogFactory
和CatFactory
类来分别创建Dog
和Cat
实例,由调用端来决定使用哪个工厂来创建对象。
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、适用场景
- 工厂模式屏蔽了创建类的内部细节,降低了调用类之间的耦合度。
- 如果一个类的创建流程比较复杂,使用工厂类可以有效的降低系统复杂度。
- 工厂模式依靠抽象架构,具有较好的拓展性。