cari
RumahJavajavaTutorial设计模式之工厂模式的简介与使用

设计模式之工厂模式的简介与使用

Jul 03, 2017 am 11:31 AM
kilangmodelcorak reka bentuk

简单工厂模式

简单工厂模式是类的创建模式,又叫做静态工厂方法模式。简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例。

 

为什么要使用简单工厂模式

原因很简单:解耦。

 

LOL场景分析:

LOL中目前有100多个英雄,各个人物的技能全都不同,具体英雄的代码实现必定不同;

但是每个英雄的技能都是Q、W、E、R这4个基本技能,以及召唤师技能D、F;

虽然选择的英雄不同,但游戏的其他部分应该是完全相同的,不可能根据我们选择的英雄不同,而完全改变其他通用部分的逻辑!

 

如何实现这样的应用场景

召唤师技能常量类

public class SummonerSkillName {  
  public static final String FLASH = "Flash";//闪现  public static final String HEAL = "Heal";//治疗  public static final String IGNITE = "Ignite";//引燃  public static final String REVIVE = "Revive";//惩戒  public static final String TELEPORT = "Teleport";//传送  public static final String EXHAUST = "ExhaustSS";//虚弱
  
}

召唤师技能接口

<span style="color: #0000ff">public</span> <span style="color: #0000ff">interface</span><span style="color: #000000"> SummonerSkill {  
  </span><span style="color: #0000ff">void</span><span style="color: #000000"> release();//释放技能
  
}<br></span>

召唤师技能实现类1:闪现

public class FlashSS implements SummonerSkill {  
  public static final String NAME = "闪现";
  
  @Override  public void release() {
    System.out.println("闪现");
  }
  
}

召唤师技能实现类2:引燃

public class IgniteSS implements SummonerSkill {  public static final String NAME = "引燃";

  @Override  public void releaseSS() {
    System.out.println("引燃");
  }

}

召唤师技能工厂

public class SummonerSkillFactory {  
  public static SummonerSkill getSkillSS(String ssName) throws Exception {
    
    SummonerSkill ss;if (ssName.equals(SummonerSkillName.FLASH)) {
      ss = new FlashSS();
    } else if (ssName.equals(SummonerSkillName.TELEPORT)) {
      ss = new TeleportSS();
    } else if (ssName.equals(SummonerSkillName.HEAL)) {
      ss = new HealSS();
    } else if (ssName.equals(SummonerSkillName.IGNITE)) {
      ss = new IgniteSS();
    } else if (ssName.equals(SummonerSkillName.EXHAUST)) {
      ss = new ExhaustSS();
    } else {
      ss = new ReviveSS();
    }    return ss;
  }
  
}

改进之后的工厂,使用反射:

public class SummonerSkillFactory {  
  private static final String CLASS_NAME_SUFFIX = "SS";  
  public static SummonerSkill getSkillSS(String ssName) throws Exception {

    String className = ssName + classNameSuffix;
    String packageName = SummonerSkill.class.getPackage().getName();
    SummonerSkill ss = (SummonerSkill) Class.forName(packageName + "." + className).newInstance();    return ss;
  }
  
}

脑补一下如果100多个英雄也用 if else,画面得有多美~

这样的好处不仅在于代码编写量小很多,而且假定新增召唤师技能的话,工厂的代码不需要更改,遵守了开闭原则。

public class LeagueClient {
  
  @Test  public void selectHero() throws Exception {
    SummonerSkill flash = SummonerSkillFactory.getSkillSS(SummonerSkillName.FLASH);
    SummonerSkill ignite = SummonerSkillFactory.getSkillSS(SummonerSkillName.IGNITE); 
}

 

简单工厂模式或者说工厂模式的关注点并不在于在工厂中是如何生产出来需要的类的,而在于将创建产品与消费产品分离

前面使用过if...else if...else、反射,除了这些方法,还可以有别的方法可以创建产品,比如传入一个具体产品的标识,根据这个标识去数据库里面查询。

 

工厂模式的优缺点

优点:

1、简单优化了软件体系结构,明确了各自功能模块的职责和权利

2、通过工厂类,外界不需要直接创建具体产品对象,只需要负责消费,不需要关心内部如何创建对象

缺点:

1、改进前的简单工厂模式全部创建逻辑都集中在一个工厂类中,能创建的类只能是考虑到的,如果需要添加新的类,就必须改变工厂类了

2、改进前的简单工厂模式随着具体产品的不断增多,可能会出现共产类根据不同条件创建不同实例的需求,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免功能模块的蔓延,对系统的维护和扩展不利

3、改进后的简单工厂模式主要是使用反射效率会低一些

Atas ialah kandungan terperinci 设计模式之工厂模式的简介与使用. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa