🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 抽象工厂 抽象工厂模式看起来像我们之前所见的工厂对象,但拥有不是一个工厂方法而是几个工厂方法, 每个工厂方法都会创建不同种类的对象。 这个想法是在创建工厂对象时,你决定如何使用该工厂创建的所有对象。 《设计模式》中提供的示例实现了跨各种图形用户界面(GUI)的可移植性:你创建一个适合你正在使用的GUI的工厂对象,然后从中请求菜单,按钮,滑块等等,它将自动为GUI创建适合该项目版本的组件。 因此,你可以将从一个GUI更改为另一个所产生的影响隔离限制在一处。 作为另一个示例,假设你正在创建一个通用游戏环境来支持不同类型的游戏。 使用抽象工厂看起来就像下文那样: ```java // patterns/abstractfactory/GameEnvironment.java // An example of the Abstract Factory pattern // {java patterns.abstractfactory.GameEnvironment} package patterns.abstractfactory; import java.util.function.*; interface Obstacle { void action(); } interface Player { void interactWith(Obstacle o); } class Kitty implements Player { @Override public void interactWith(Obstacle ob) { System.out.print("Kitty has encountered a "); ob.action(); } } class KungFuGuy implements Player { @Override public void interactWith(Obstacle ob) { System.out.print("KungFuGuy now battles a "); ob.action(); } } class Puzzle implements Obstacle { @Override public void action() { System.out.println("Puzzle"); } } class NastyWeapon implements Obstacle { @Override public void action() { System.out.println("NastyWeapon"); } } // The Abstract Factory: class GameElementFactory { Supplier<Player> player; Supplier<Obstacle> obstacle; } // Concrete factories: class KittiesAndPuzzles extends GameElementFactory { KittiesAndPuzzles() { player = Kitty::new; obstacle = Puzzle::new; } } class KillAndDismember extends GameElementFactory { KillAndDismember() { player = KungFuGuy::new; obstacle = NastyWeapon::new; } } public class GameEnvironment { private Player p; private Obstacle ob; public GameEnvironment(GameElementFactory factory) { p = factory.player.get(); ob = factory.obstacle.get(); } public void play() { p.interactWith(ob); } public static void main(String[] args) { GameElementFactory kp = new KittiesAndPuzzles(), kd = new KillAndDismember(); GameEnvironment g1 = new GameEnvironment(kp), g2 = new GameEnvironment(kd); g1.play(); g2.play(); } } ``` 输出结果: ```java Kitty has encountered a Puzzle KungFuGuy now battles a NastyWeapon ``` 在这种环境中,**Player**对象与**Obstacle**对象进行交互,但是根据你所玩游戏的类型,存在不同类型的玩家和障碍物。 你可以通过选择特定的**GameElementFactory**来确定游戏的类型,然后**GameEnvironment**控制游戏的设置和玩法。 在此示例中,设置和玩法非常简单,但是这些活动(初始条件和状态变化)可以决定游戏的大部分结果。 这里,**GameEnvironment**不是为继承而设计的,尽管这样做很有意义。 它还包含“双重调度”和“工厂方法”的示例,稍后将对这两个示例进行说明。