Java 工厂方法创建对象

引言

在软件开发中,经常会遇到需要创建多个相似对象的情况。如果每次都使用new关键字来创建对象,当需要修改对象的创建方式时,就需要修改多处代码。而通过使用工厂方法模式,我们可以将对象的创建过程封装在一个工厂类中,从而实现对象的创建和使用的解耦。

本文将介绍Java中的工厂方法模式,通过代码示例详细讲解其原理和用法。

工厂方法模式简介

工厂方法模式是一种创建型设计模式,它提供了一个接口,用于创建对象,但在不暴露对象创建逻辑的情况下。工厂方法模式通过定义一个创建对象的接口,由子类决定具体实例化哪个类。

工厂方法模式包含以下角色:

  • 抽象产品(Product):定义产品的接口,是工厂方法模式创建的对象的父类。
  • 具体产品(ConcreteProduct):实现抽象产品接口的具体类。
  • 抽象工厂(Creator):定义工厂方法的接口,用于创建抽象产品。
  • 具体工厂(ConcreteCreator):实现抽象工厂接口的具体类,用于创建具体产品。

工厂方法模式的核心思想是将对象的实例化交给子类来完成,从而避免在客户端代码中编写与具体产品类耦合的代码。

工厂方法模式示例

下面通过一个简单的示例来演示工厂方法模式的使用。假设我们正在开发一个游戏,游戏中有多种不同类型的敌人,每个敌人有不同的属性和行为。我们需要使用工厂方法模式来创建这些敌人对象。

抽象产品

首先,我们定义一个抽象产品接口Enemy,该接口包含敌人的公共方法:

// Enemy.java
public interface Enemy {
    void attack();
    void move();
}

具体产品

接下来,我们实现两个具体的敌人类MonsterRobot,它们都实现了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();
}

具体工厂

接下来,我们实现两个具体的工厂类MonsterFactoryRobotFactory,分别用于创建MonsterRobot对象:

// 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类通过工厂方法创建了MonsterRobot对象,并调用它们的方法。这样,当需要添加新的敌人类型时,只需要创建相应的具体产品和具体工厂类即可,而不需要修改客户端代码。

工厂方法模式的优点