意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
什么是产品族?举个栗子,CF,LOL是腾讯游戏,腾讯就是一个产品族,而荒野行动,阴阳师是网易游戏,网易也是一个产品族。
为什么使用抽象工厂?你想想,如果用之前才抽象工厂模式,CF和荒野行动属于FPS类。LOL和阴阳师属于MOBA类,我们需要定义CF工厂,LOL工厂,荒野行动工厂,阴阳师工厂,极为的不方便,类太多,容易增加系统的复杂度。
那么直接上代码吧!
public interface FpsGame {
public void showFpsGameMsg();
}
public interface MobaGame {
public void showMobaGameMsg();
}
public class CF implements FpsGame{
@Override
public void showFpsGameMsg() {
System.out.println("穿越火线");
}
}
public class HYXD implements FpsGame{
@Override
public void showFpsGameMsg() {
System.out.println("荒野行动");
}
}
public class LOL implements MobaGame{
@Override
public void showMobaGameMsg() {
System.out.println("英雄联盟");
}
}
public class YYS implements MobaGame{
@Override
public void showMobaGameMsg() {
System.out.println("阴阳师");
}
}
public abstract class GameFactory {
public FpsGame createFpsGame(){
return null;
}
public MobaGame createMobaGame(){
return null;
}
}
public class NeteaseGameFactory extends GameFactory{
@Override
public FpsGame createFpsGame() {
return new HYXD();
}
@Override
public MobaGame createMobaGame() {
return new YYS();
}
}
public class TenCentGameFactory extends GameFactory{
@Override
public FpsGame createFpsGame() {
return new CF();
}
@Override
public MobaGame createMobaGame() {
return new LOL();
}
}
public class Main {
public static void main(String[] args) throws SocketException, InterruptedException {
GameFactory gameFactory=new NeteaseGameFactory();
gameFactory.createFpsGame().showFpsGameMsg();
}
}
这里个人有一个小小的问题,王者荣耀和LOL都是MOBA游戏,都是腾讯的,那工厂又怎么实现呢?这个问题留在后面解决。另外文章有什么问题呢?(反正我个人感觉栗子不好吃)请各位提出来,相互交流学习改进!谢谢