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

一、模式介绍

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

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

二、举例说明

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

使用工厂方法实现

  1. 创建一个产品类Hero
    public interface Hero {
       String ultimateSkill();
    }
    
  2. 创建产品的实现
    /**
     * 老鼠·图奇
     *
     * @author: jsk
     * @date: 2019/5/25 18:21
     */
    public class Twitch implements Hero {
        @Override
        public String ultimateSkill() {
            return "火力全开...";
        }
    }
    
  3. 定义一个创建者
    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);
    }
    
    
  4. 创建者的实现
    /**
     * 射手工厂
     *
     * @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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值