从王者荣耀看设计模式(四.简单工厂模式)

从王者荣耀看设计模式(简单工厂模式)

一.简介

游戏开始前,玩家可从英雄池自由挑选将要出战的英雄

二.简单工厂模式

简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

  • 这其中的设计原则有:
  1. 有一个专门的类来负责创建实例的过程。具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。
  2. 简单工厂模式中包含的角色及其相应的职责如下:

    工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
    抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
    具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

  • 简单工厂模式的优点
    用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化
  • 简单工厂模式的缺点
  1. 由于一切逻辑都集中在一个工厂类中,导致了没有很高的内聚性,同时也违背了“开放封闭原则”
  2. 简单工厂模式的方法一般都是静态的,而静态工厂方法是无法让子类继承的,因此,简单工厂模式无法形成基于基类的继承树结构。

三.结构图

结构图

四.设计类图

类图

五.代码实现

HeroFactory(简单工厂类)根据玩家选择创建相应类的实例

package com.game.Factory;
/*
 * 简单工厂类(提供创建接口)
 */
import com.game.domain.Hero;
import com.game.domain.HouYi;
import com.game.domain.LuBanQiHao;

public class HeroFactory {
    public static Hero createHero(String HeroName) throws Exception {
        //传入HouYi,工厂创建并返回HouYi实例
        if(HeroName.equalsIgnoreCase("HouYi")) {
            return new HouYi();
        }else if(HeroName.equalsIgnoreCase("LuBanQiHao")){
        //传入LuBanQiHao,工厂创建并返回LuBanQiHao实例
            return new LuBanQiHao();
        }else {
            throw new Exception();//抛出异常
        }
    }
}

HeroFactoryTest测试类

package com.game.test;
/*
 * 英雄工厂测试类
 */

import com.game.Factory.HeroFactory;
import com.game.domain.Hero;

public class HeroFactoryTest {
    public static void main(String [] args) {
        //使用工厂的创建工厂方法,传入英雄的名称,由工厂创建英雄
        try {
            //1.选择英雄后羿
            System.out.println("=======choose1=======");
            System.out.println("请选择你的英雄:");
            //向工厂传入英雄的名称
            Hero hero1 = HeroFactory.createHero("HouYi");
            System.out.println("您选择的英雄是【"+hero1.getHeroName()+"】");
            hero1.display();
            //2.选择英雄鲁班七号
            System.out.println("=======choose2========");
            System.out.println("请选择你的英雄:");
            //向工厂传入英雄的名称
            Hero hero2 = HeroFactory.createHero("LuBanQiHao");
            System.out.println("您选择的英雄是【"+hero2.getHeroName()+"】");
            hero2.display();
        }catch(Exception e) {//捕捉异常
            System.out.println("不存在此英雄!");
        }
    }
}

运行结果
结果

猜你喜欢

转载自www.cnblogs.com/miaowulj/p/11441577.html