从王者荣耀看设计模式(简单工厂模式)
一.简介
游戏开始前,玩家可从英雄池自由挑选将要出战的英雄
二.简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
模式动机
在实际的软件开发过程中,有时需要创建一些来自相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,这些被创建的实例具有相同的父类。在这种情况下,可以通过传入不同的参数从而获得不同的对象。在本实例中,存在一个英雄的工厂,传入英雄的名称便可得到该英雄的实例。
- 这其中的设计原则有:
- 有一个专门的类来负责创建实例的过程。具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。
- 简单工厂模式中包含的角色及其相应的职责如下:
工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
- 简单工厂模式的优点
用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化 - 简单工厂模式的缺点
- 由于一切逻辑都集中在一个工厂类中,导致了没有很高的内聚性,同时也违背了“开放封闭原则”
- 简单工厂模式的方法一般都是静态的,而静态工厂方法是无法让子类继承的,因此,简单工厂模式无法形成基于基类的继承树结构。
三.结构图
四.设计类图
五.代码实现
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("不存在此英雄!");
}
}
}