zoukankan      html  css  js  c++  java
  • 从王者荣耀看设计模式(简单工厂模式)

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

    一.简介

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

    二.简单工厂模式

    简单工厂模式(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("不存在此英雄!");
    		}
    	}
    }
    
    

    六.运行结果

    结果

    七.源代码下载

    从王者荣耀看设计模式

  • 相关阅读:
    PAT顶级 1015 Letter-moving Game (35分)
    PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
    PAT顶级 1025 Keep at Most 100 Characters (35分)
    PAT顶级 1027 Larry and Inversions (35分)(树状数组)
    PAT 顶级 1026 String of Colorful Beads (35分)(尺取法)
    PAT顶级 1009 Triple Inversions (35分)(树状数组)
    Codeforces 1283F DIY Garland
    Codeforces Round #438 A. Bark to Unlock
    Codeforces Round #437 E. Buy Low Sell High
    Codeforces Round #437 C. Ordering Pizza
  • 原文地址:https://www.cnblogs.com/miaowulj/p/11441577.html
Copyright © 2011-2022 走看看