>Java >java지도 시간 >팩토리 패턴 디자인 패턴 소개 및 활용

팩토리 패턴 디자인 패턴 소개 및 활용

零下一度
零下一度원래의
2017-07-03 11:31:181694검색

간단한 팩토리 패턴

간단한 팩토리 패턴은 클래스 생성 패턴으로, 정적 팩토리 메서드 패턴이라고도 합니다. 단순 팩토리 패턴은 팩토리 객체를 사용하여 생산할 제품 클래스 인스턴스를 결정합니다.

간단한 팩토리 패턴을 사용하는 이유

이유는 간단합니다. 디커플링입니다.

LOL 장면 분석:

현재 LOL에는 100명이 넘는 영웅이 있습니다. 각 캐릭터의 스킬은 모두 다르고 특정 영웅의 코드 구현도 달라야 합니다.

하지만 각 영웅의 스킬은 다릅니다. Q, W, E, R 네 가지 기본 스킬과 소환사 스킬 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: Flash

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

소환사 스킬 구현 카테고리 2: Ignite

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

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

}

Summoner Skill Factory

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;
  }
  
}

Reflection을 사용하여 개선된 Factory:

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와 Reflection을 사용해 본 적이 있습니다. 이러한 방법 외에도 특정 제품의 ID를 전달하고 이를 기반으로 데이터베이스를 쿼리하는 등 제품을 만드는 다른 방법도 있습니다. ID.

팩토리 모델의 장점과 단점

장점:

1. 간단히 소프트웨어 아키텍처를 최적화하고 각 기능 모듈의 책임과 권한을 명확히 합니다.

2. 특정 제품을 직접 생성할 필요가 없음 객체는 소비만 담당하면 되며 내부적으로 객체 생성 방법을 신경 쓸 필요가 없습니다

단점:

1. 개선 전 단순 팩토리 패턴의 모든 생성 로직이 집중되어 있습니다. 새로운 클래스를 추가해야 하는 경우에는 팩토리 클래스를 변경해야 합니다.

2. 특정 제품이 계속해서 개선되기 전의 간단한 팩토리 모델입니다. 증가하면 공통 클래스가 서로 다른 조건에 따라 서로 다른 인스턴스를 생성해야 할 필요가 있을 수 있습니다. 시스템 유지 보수 및 확장

3. 개선된 단순 팩토리 모드는 주로 반사를 사용하므로 효율성이 떨어집니다

위 내용은 팩토리 패턴 디자인 패턴 소개 및 활용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.