设计模式之工厂模式

工厂模式介绍

定义

在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。

工厂模式的分类

  • 简单工厂, 又称为静态工厂方法模式
  • 工厂方法, 又称为多态性工厂模式
  • 抽象工厂, 又称为工具箱模式

使用工厂模式的好处

  • 解耦:把对象的创建和使用的过程分开
  • 降低代码重复:如果创建某个对象的过程十分复杂,需要一定的代码量,如果很多地方都要用到,那么就会有很多重复的代码。
  • 降低维护成本:由于创建过程都有工厂统一管理,所以发生业务逻辑变化,不需要找到所以创建对象的方法逐个去修正,只需要在工厂里修改即可,降低维护成本。

简单工厂(此处使用反射机制实现)

适用场景

  • 需要创建的对象较少
  • 客户端不关心对象的创建过程

简单工厂模式角色分配

  • 抽象产品角色:简单工厂模式所创建的所有对象的父类,它负责描述所有公共接口
1
2
3
public interface Animal {
void sing();
}
  • 具体产品角色:简单工厂模式的创建目标
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Dog implements Animal {
@Override
public void sing() {
System.out.println("Wang Wang ~~");
}
}

public class Cat implements Animal {
@Override
public void sing() {
System.out.println("Miao miao ~~");
}
}
  • 抽象产品角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。
1
2
3
4
5
6
7
8
9
10
11
12
13
public class AnimalFactory {
public static Object getClass(Class<? extends Animal> clazz) {
Object obj = null;

try {
obj = Class.forName(clazz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}

return obj;
}
}

工厂方法模式(使用最多)

工厂方法是简单工厂的进一步深化,在工厂方法模式中, 我们不再提供一个统一的工厂类来创建所有的对象, 而是针对不同的对象去提供不同的工厂, 也就是说 每个对象都有一个与之对应的工厂

工厂方法模式的角色分配

  • 抽象产品角色: 工厂方法模式锁创建的对象的父类
1
2
3
public interface Animal {
void sing();
}
  • 具体产品角色:这个角色实现了抽象产品角色所定义的接口
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Dog implements Animal {
@Override
public void sing() {
System.out.println("Wang Wang ~~");
}
}

public class Cat implements Animal {
@Override
public void sing() {
System.out.println("Miao miao ~~");
}
}
  • 抽象工厂角色:工厂方法模式的核心, 是所有工程类的接口类
1
2
3
public interface Factory {
Animal getAnimal();
}
  • 具体工厂角色:实现抽象工厂接口的具体工厂类
1
2
3
4
5
6
public class DogFactory implements Factory {
@Override
public Animal getAnimal() {
return new Dog();
}
}

抽象工厂

抽象工厂是生产出一套产品的(至少两个),这些产品是相互有关系或者有关联的, 而工厂方法是生产单一产品的工厂。

参考

深入理解工厂模式——由对象工厂生成对象

本文标题:设计模式之工厂模式

文章作者:Enda Lin

发布时间:2019年06月11日 - 21:13

最后更新:2019年07月08日 - 09:15

原始链接:https://wt-git-repository.github.io/2019/06/11/设计模式之工厂模式/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。