工厂方法模式:创建不同类型的英雄

    xiaoxiao2023-11-14  151

    一、模式介绍

    工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

    相关组件 Product:定义工厂方法所创建的对象的接口,也就是实际需要使用的对象的接口。 ConcreteProduct:具体的Product接口的实现对象。 Creator:创建器,声明工厂方法,工厂方法通常会返回一个Product类型的实例对象,而且多是抽象方法。也可以在Creator里面提供工厂方法的默认实现,让工厂方法返回一个缺省的Product类型的实例对象。 ConcreteCreator:具体的创建器对象,覆盖实现Creator定义的工厂方法,返回具体的Product实例。

    二、举例说明

    场景:根据名称创建一个英雄,并释放这个英雄的大招。英雄池中的数量可能会不断增加或者减少。具体需求:现在射手类的英雄有27位,随着游戏版本的迭代会增加或者移除这些英雄。现需要根据英雄的名称,创建一个对应的英雄,并释放该英雄的大招。每个英雄释放大招的步骤都一样,但这个过程比较复杂,不希望以后增减英雄会改动这个放大招的方法。

    使用工厂方法实现

    创建一个产品类Heropublic interface Hero { String ultimateSkill(); } 创建产品的实现/** * 老鼠·图奇 * * @author: jsk * @date: 2019/5/25 18:21 */ public class Twitch implements Hero { @Override public String ultimateSkill() { return "火力全开..."; } } 定义一个创建者public abstract class HeroPool { /** * 创建的具体实现交给不同的子类,增加或者减少英雄都不改动此方法 * * @param heroName */ void skill(String heroName) { Hero hero = createHero(heroName); System.out.println("我是" + heroName + ",我的大招是:" + hero.ultimateSkill()); } /** * 工厂方法,由具体的子类实现 * * @param heroName * @return */ abstract Hero createHero(String heroName); } 创建者的实现/** * 射手工厂 * * @author: jsk * @date: 2019/5/25 18:28 */ public class Shooter extends HeroPool { @Override Hero createHero(String heroName) { if("twitch".equals(heroName)){ return new Twitch(); } return null; } }

    程序运行

    public static void main(String[] args) { HeroPool shooterHeroPool = new Shooter(); shooterHeroPool.skill("twitch"); }

    最新回复(0)