一、模式介绍
- 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
- 设计原则
依赖抽象,不要依赖具体类。 - 相关组件
- Abstract Factory :抽象工厂,定义创建一系列产品对象的操作接口。
- Concrete Factory :具体的工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建。
- Abstract Product :定义一类产品对象的接口。
- Concrete Product :具体的产品实现对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象。
- Client :客户端,主要使用抽象工厂来获取一系列所需要的产品对象,然后面向这些产品对象的接口编程,以实现需要的功能。
二、举例说明
- 场景:客户使用抽象的工厂接口创建一组相关的产品,而不需要关心实际产出的具体产品是什么。
- 具体需求:在人机对战中有两种模式:简单、中级;每种模式都会创建一个法师英雄、一个射手英雄,要求设计一个可扩展的程序,实现切换模式,产生不同级别的英雄。
三、代码实现
-
创建抽象的产品:法师、射手
public interface Mage { String getName(); } public interface Shooter { String getName(); }
-
创建产品的实现(简单法师、射手;中级法师、射手)
/** * 简单模式下的法师 * * @author: jsk * @date: 2019/6/1 18:29 */ public class SmallMage implements Mage { @Override public String getName() { return "我是一个弱小的法师... 法术伤害100+"; } } /** * 中级模式下的法师 * * @author: jsk * @date: 2019/6/1 18:30 */ public class BigMage implements Mage { @Override public String getName() { return "我是一个超级厉害的法师! 法术伤害500+"; } } /** * 简单模式下的射手 * * @author: jsk * @date: 2019/6/1 18:31 */ public class SmallShooter implements Shooter { @Override public String getName() { return "我是一个弱小的射手... 攻击力100+"; } } /** * 中级模式下的射手 * * @author: jsk * @date: 2019/6/1 18:30 */ public class BigShooter implements Shooter { @Override public String getName() { return "我是一个超级厉害的射手! 攻击力500+"; } }
-
创建游戏模式(抽象工厂)
public interface GameFactory { /** * 获取法师 * * @return */ Mage getMage(); /** * 获取射手 * * @return */ Shooter getShooter(); }
-
游戏模式的实现(简单模式、中级模式)
public class SimpleGameFactory implements GameFactory { @Override public Mage getMage() { return new SmallMage(); } @Override public Shooter getShooter() { return new SmallShooter(); } } public class MiddleGameFactory implements GameFactory { @Override public Mage getMage() { return new BigMage(); } @Override public Shooter getShooter() { return new BigShooter(); } }
-
客户端调用
public static void main(String[] args) { GameFactory gameFactory = new SimpleGameFactory(); start(gameFactory); System.out.println("*******结束了*********"); System.out.println("游戏太简单了,换个难度等级吧!"); gameFactory = new MiddleGameFactory(); start(gameFactory); } public static void start(GameFactory gameFactory) { System.out.println("游戏开始了!"); System.out.println(gameFactory.getMage().getName()); System.out.println(gameFactory.getShooter().getName()); }
执行结果