Java 工厂方法创建对象
引言
在软件开发中,经常会遇到需要创建多个相似对象的情况。如果每次都使用new
关键字来创建对象,当需要修改对象的创建方式时,就需要修改多处代码。而通过使用工厂方法模式,我们可以将对象的创建过程封装在一个工厂类中,从而实现对象的创建和使用的解耦。
本文将介绍Java中的工厂方法模式,通过代码示例详细讲解其原理和用法。
工厂方法模式简介
工厂方法模式是一种创建型设计模式,它提供了一个接口,用于创建对象,但在不暴露对象创建逻辑的情况下。工厂方法模式通过定义一个创建对象的接口,由子类决定具体实例化哪个类。
工厂方法模式包含以下角色:
- 抽象产品(Product):定义产品的接口,是工厂方法模式创建的对象的父类。
- 具体产品(ConcreteProduct):实现抽象产品接口的具体类。
- 抽象工厂(Creator):定义工厂方法的接口,用于创建抽象产品。
- 具体工厂(ConcreteCreator):实现抽象工厂接口的具体类,用于创建具体产品。
工厂方法模式的核心思想是将对象的实例化交给子类来完成,从而避免在客户端代码中编写与具体产品类耦合的代码。
工厂方法模式示例
下面通过一个简单的示例来演示工厂方法模式的使用。假设我们正在开发一个游戏,游戏中有多种不同类型的敌人,每个敌人有不同的属性和行为。我们需要使用工厂方法模式来创建这些敌人对象。
抽象产品
首先,我们定义一个抽象产品接口Enemy
,该接口包含敌人的公共方法:
// Enemy.java
public interface Enemy {
void attack();
void move();
}
具体产品
接下来,我们实现两个具体的敌人类Monster
和Robot
,它们都实现了Enemy
接口:
// Monster.java
public class Monster implements Enemy {
@Override
public void attack() {
System.out.println("Monster is attacking!");
}
@Override
public void move() {
System.out.println("Monster is moving!");
}
}
// Robot.java
public class Robot implements Enemy {
@Override
public void attack() {
System.out.println("Robot is attacking!");
}
@Override
public void move() {
System.out.println("Robot is moving!");
}
}
抽象工厂
然后,我们定义一个抽象工厂接口EnemyFactory
,该接口包含创建敌人对象的方法:
// EnemyFactory.java
public interface EnemyFactory {
Enemy createEnemy();
}
具体工厂
接下来,我们实现两个具体的工厂类MonsterFactory
和RobotFactory
,分别用于创建Monster
和Robot
对象:
// MonsterFactory.java
public class MonsterFactory implements EnemyFactory {
@Override
public Enemy createEnemy() {
return new Monster();
}
}
// RobotFactory.java
public class RobotFactory implements EnemyFactory {
@Override
public Enemy createEnemy() {
return new Robot();
}
}
客户端代码
最后,我们编写一个客户端类Game
,使用工厂方法模式创建敌人对象:
// Game.java
public class Game {
public static void main(String[] args) {
EnemyFactory monsterFactory = new MonsterFactory();
Enemy monster = monsterFactory.createEnemy();
monster.attack();
monster.move();
EnemyFactory robotFactory = new RobotFactory();
Enemy robot = robotFactory.createEnemy();
robot.attack();
robot.move();
}
}
在上述示例中,Game
类通过工厂方法创建了Monster
和Robot
对象,并调用它们的方法。这样,当需要添加新的敌人类型时,只需要创建相应的具体产品和具体工厂类即可,而不需要修改客户端代码。