什么是工厂方法模式
工厂方法模式是工厂模式的一种,用于生产同一等级中的固定产品(支持增加任意产品)。它定义了一个创建对象的抽象方法,由子类决定要实例化的类。
也就是说,工厂方法模式,将对象的实例化推迟到子类中实现。
为什么要用工厂方法模式
通过使用简单工厂模式,我们可以很优雅得实现不同播放器的调用。
有没有别的方式来优雅实现?
俗话说,条条大路通罗马,优雅实现的方式也不止一种,这次我们使用“工厂方法模式”。
由一个工厂负责一个产品,这就成了工厂方法模式:
为了减少代码量,只使用bilibili和youku两个播放器做演示。
工厂方法模式实现:
工厂类接口:
public interface IPlayerFactory {
Iplayer getPlayer();
}
两个工厂实现:
public class BilibiliFactory implements IPlayerFactory{
@Override
public IPlayer getPlayer() {
return new Bilibili();
}
}
public class YoukuFactory implements IPlayerFactory{
@Override
public IPlayer getPlayer() {
return new Youku();
}
}
客户端:
import java.util.Scanner;
public class User {
public static void main(String[] args) {
IPlayerFactory playerFactory;
String type = getType();
if ("bilibili".equals(type)) {
playerFactory = new PhoneBilibiliFactory();
} else if ("youku".equals(type)) {
playerFactory = new PhoneYoukuFactory();
} else {
System.out.println("没有此播放器");
return;
}
IPlayer player = playerFactory.getPlayer();
player.play();
}
private static String getType() {
Scanner scanner = new Scanner(System.in);
return scanner.nextLine();
}
}
这样,我们用工厂方法模式实现了逻辑代码。
类图:
这和最传统的方式有什么区别?
我们看到在工厂方法模式实现的客户端代码和一开始的传统方法实现方式相差无几,甚至比传统方法还复杂了不少,那我们为什么还要用工厂方法模式?
- 在使用工厂方法模式之前,用于直接与具体产品对接,需要自己生产,传统方法即是这样;
- 在使用工厂方法模式之后,用户与工厂对接,工厂与产品对接,而非用户直接与产品对接,产品由工厂生产。
- 在使用工厂方法模式之前,用户需要熟知创建一个产品的所有步骤才可以获取一个产品(可以想象成用户需要自己编写一个播放器);
- 在使用工厂方法模式之后,用户只需要知道有哪些工厂,直接去问工厂要一个产品即可,无需了解该产品是如何生产的(可以想象成用户从应用商店中下载一个播放器)。