>  기사  >  Java  >  Java의 팩토리 메소드 패턴에 대한 자세한 분석

Java의 팩토리 메소드 패턴에 대한 자세한 분석

黄舟
黄舟원래의
2017-08-07 10:26:051379검색

이 글에서는 Power Node Java Academy에서 정리한 팩토리 메소드 패턴 관련 정보를 주로 소개합니다. 필요하신 분들은 참고하시면 됩니다.

정의: 객체 생성을 위한 인터페이스를 정의하고 인스턴스화할 클래스를 하위 클래스에서 결정하도록 하고, 팩토리 메소드는 인스턴스화를 연기합니다. 클래스에서 하위 클래스로.

Type: 클래스 패턴 만들기

클래스 다이어그램:

Factory 메서드 패턴 코드


interface IProduct { 
  public void productMethod(); 
} 
class Product implements IProduct { 
  public void productMethod() { 
    System.out.println("产品"); 
  } 
} 

interface IFactory { 
  public IProduct createProduct(); 
} 
 
class Factory implements IFactory { 
  public IProduct createProduct() { 
    return new Product(); 
  } 
} 

public class Client { 
  public static void main(String[] args) { 
    IFactory factory = new Factory(); 
    IProduct prodect = factory.createProduct(); 
    prodect.productMethod(); 
  } 
}

Factory:

                                                                            우선, 우리가 필요로 하는 것은 공장 모드에 대해 이야기하겠습니다. 팩토리 패턴은 추상화 정도에 따라 단순 팩토리 패턴(정적 팩토리 패턴이라고도 함), 이 문서에서 설명하는 팩토리 메서드 패턴, 추상 팩토리 패턴의 세 가지 유형으로 구분됩니다. 팩토리 패턴은 프로그래밍에서 자주 사용되는 패턴입니다. 주요 장점은 다음과 같습니다.

  • 코드 구조를 명확하게 만들고 변경 사항을 효과적으로 캡슐화할 수 있습니다. 프로그래밍에서 제품 클래스의 인스턴스화는 때때로 복잡하고 변경 가능합니다. 팩토리 패턴을 통해 제품의 인스턴스화가 캡슐화되므로 호출자는 제품의 인스턴스화 프로세스에 전혀 신경 쓸 필요가 없으며 단지 인스턴스화만 하면 됩니다. 원하는 제품을 얻기 위해 공장에 의존하십시오.

  • 발신자의 특정 제품 카테고리를 차단합니다. 팩토리 패턴을 사용하는 경우 호출자는 제품 인터페이스에만 관심이 있으며 특정 구현에 대해서는 호출자가 전혀 신경 쓸 필요가 없습니다. 특정 구현이 변경되더라도 호출자에게 영향을 주지 않습니다.

  • 커플링을 줄여보세요. 제품 클래스의 인스턴스화는 일반적으로 매우 복잡하며, 이러한 클래스는 호출자에게 알려질 필요가 없습니다. 그런 다음 제품 클래스를 인스턴스화하기만 하면 됩니다. 사용하도록 발신자에게 전달됩니다. 호출자에게는 제품이 의존하는 클래스가 투명합니다.

팩토리 메소드 패턴:

팩토리 메소드 패턴의 클래스 다이어그램에서 팩토리 메소드 패턴에는 4가지 요소,

  • Factory 인터페이스가 있음을 알 수 있습니다. 팩토리 인터페이스는 호출자와 직접 상호 작용하여 제품을 제공하는 팩토리 메서드 패턴의 핵심입니다. 실제 프로그래밍에서는 추상 클래스가 호출자와 상호 작용하기 위한 인터페이스로 사용되는 경우가 있는데, 이는 본질적으로 동일합니다.

  • 공장 구현. 프로그래밍에서 팩토리 구현은 제품을 인스턴스화하는 방법을 결정합니다. 이는 확장을 달성하는 방법입니다. 필요한 제품 수는 필요한 특정 팩토리 구현 수에 따라 다릅니다.

  • 제품 인터페이스. 제품 인터페이스의 주요 목적은 제품의 사양을 정의하는 것이며, 모든 제품 구현은 제품 인터페이스에서 정의한 사양을 따라야 합니다. 제품 인터페이스는 호출자가 가장 우려하는 부분입니다. 제품 인터페이스 정의의 품질은 호출자 코드의 안정성을 직접적으로 결정합니다. 마찬가지로 제품 인터페이스도 추상 클래스로 대체될 수 있지만 Liskov 대체 원칙을 위반하지 않도록 주의하세요.

  • 제품 구현. 제품 인터페이스를 구현하는 특정 클래스는 클라이언트에서 제품의 특정 동작을 결정합니다.

위에서 언급한 단순 팩토리 패턴은 팩토리 메서드 패턴과 매우 유사합니다. 차이점은 단순 팩토리에는 세 가지 요소만 있고 팩토리 인터페이스가 없으며 제품을 얻는 방법이 일반적으로 정적이라는 것입니다. 팩토리 인터페이스가 없기 때문에 팩토리 구현의 확장성이 약간 약합니다. 여기서는 팩토리 메소드 패턴의 단순화된 버전으로 간주할 수 있습니다.

적용 가능한 시나리오: 是 단순 팩토리 모델이든, 팩토리 메서드 모델이든, 추상 팩토리 모델이든 특성이 비슷하므로 적용 가능한 시나리오도 비슷합니다. ㅋㅋㅋ                                                                    우선 클래스 생성 패턴으로 팩토리 메소드 패턴은 복잡한 객체를 생성해야 하는 모든 곳에서 사용할 수 있다. 한 가지 주의할 점은 복잡한 객체는 팩토리 패턴을 사용하는 데 적합하지만, 간단한 객체, 특히 new를 통해서만 생성할 수 있는 객체는 팩토리 패턴을 사용할 필요가 없다는 점입니다. 팩토리 패턴을 사용하는 경우 팩토리 클래스를 도입해야 하므로 시스템이 더 복잡해집니다.

둘째, 팩토리 모드는 전형적인 디커플링 모드인데, 팩토리 모드에서는 디미트의 법칙이 특히 두드러집니다. 호출자가 제품을 직접 조립하고 종속성을 추가해야 하는 경우 팩토리 패턴 사용을 고려할 수 있습니다. 개체 간의 결합이 크게 줄어듭니다.模 다시 한 번 말하지만, 공장 모델은 추상 아키텍처에 의존하기 때문에 분류에서 인스턴스화된 제품 작업을 완료하고 확장성이 더 좋습니다. 즉, 시스템의 확장성이 더 좋아야 할 때 공장 모델을 고려하고, 서로 다른 구현 공장을 사용하여 서로 다른 제품을 조립할 수 있습니다.​​


일반적인 응용 프로그램

       要说明工厂模式的优点,可能没有比组装汽车更合适的例子了。场景是这样的:汽车由发动机、轮、底盘组成,现在需要组装一辆车交给调用者。假如不使用工厂模式,代码如下:


class Engine { 
  public void getStyle(){ 
    System.out.println("这是汽车的发动机"); 
  } 
} 
class Underpan { 
  public void getStyle(){ 
    System.out.println("这是汽车的底盘"); 
  } 
} 
class Wheel { 
  public void getStyle(){ 
    System.out.println("这是汽车的轮胎"); 
  } 
} 
public class Client { 
  public static void main(String[] args) { 
    Engine engine = new Engine(); 
    Underpan underpan = new Underpan(); 
    Wheel wheel = new Wheel(); 
    ICar car = new Car(underpan, wheel, engine); 
    car.show(); 
  } 
}

        可以看到,调用者为了组装汽车还需要另外实例化发动机、底盘和轮胎,而这些汽车的组件是与调用者无关的,严重违反了迪米特法则,耦合度太高。并且非常不利于扩展。另外,本例中发动机、底盘和轮胎还是比较具体的,在实际应用中,可能这些产品的组件也都是抽象的,调用者根本不知道怎样组装产品。假如使用工厂方法的话,整个架构就显得清晰了许多。


interface IFactory { 
  public ICar createCar(); 
} 
class Factory implements IFactory { 
  public ICar createCar() { 
    Engine engine = new Engine(); 
    Underpan underpan = new Underpan(); 
    Wheel wheel = new Wheel(); 
    ICar car = new Car(underpan, wheel, engine); 
    return car; 
  } 
} 
public class Client { 
  public static void main(String[] args) { 
    IFactory factory = new Factory(); 
    ICar car = factory.createCar(); 
    car.show(); 
  } 
}

        使用工厂方法后,调用端的耦合度大大降低了。并且对于工厂来说,是可以扩展的,以后如果想组装其他的汽车,只需要再增加一个工厂类的实现就可以。无论是灵活性还是稳定性都得到了极大的提高。

위 내용은 Java의 팩토리 메소드 패턴에 대한 자세한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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