팩토리 패턴
팩토리 패턴은 Java에서 가장 일반적으로 사용되는 디자인 패턴 중 하나입니다. 이러한 유형의 디자인 패턴은 객체를 생성하는 최적의 방법을 제공하는 생성 패턴입니다.
팩토리 패턴에서는 객체 생성 시 생성 로직을 클라이언트에 노출하지 않고, 공통 인터페이스를 사용하여 새로 생성된 객체를 가리킵니다.
소개
의도: 객체 생성을 위한 인터페이스를 정의하고 해당 하위 클래스가 인스턴스화할 팩토리 클래스를 결정하도록 합니다. 팩토리 패턴은 하위 클래스에 대한 생성 프로세스를 지연시킵니다. 수입.
주로 해결: 주로 인터페이스 선택 문제를 해결합니다.
사용 시기: 다른 조건에서 다른 인스턴스를 생성하려는 명시적인 계획이 있는 경우.
해결 방법: 하위 클래스가 팩토리 인터페이스를 구현하고 추상 제품을 반환하도록 합니다.
키 코드: 생성 프로세스는 하위 클래스에서 실행됩니다.
적용 사례: 1. 자동차가 필요한 경우 자동차가 어떻게 만들어졌는지, 내부 구현이 어떤지 걱정하지 않고 공장에서 직접 픽업할 수 있습니다. 2. Hibernate 데이터베이스를 변경하려면 방언과 드라이버만 변경하면 됩니다.
장점: 1. 호출자가 객체를 생성하려는 경우 해당 객체의 이름만 알면 됩니다. 2. 높은 확장성. 제품을 추가하려면 팩토리 클래스만 확장하면 됩니다. 3. 제품의 특정 구현을 보호하고 호출자는 제품 인터페이스에만 관심을 갖습니다.
단점: 제품을 추가할 때마다 특정 클래스와 객체 구현 팩토리를 추가해야 하는데, 이로 인해 시스템의 클래스 수가 두 배로 늘어나고 시스템 복잡성이 특정 수준으로 증가합니다. 복잡성으로 인해 시스템의 특정 클래스에 대한 의존도도 높아집니다. 이것은 좋은 일이 아닙니다.
사용 시나리오: 1. 로그 기록기: 기록은 로컬 하드 디스크, 시스템 이벤트, 원격 서버 등에 기록될 수 있습니다. 사용자는 로그 기록 위치를 선택할 수 있습니다. 2. 데이터베이스 액세스, 최종 시스템에서 어떤 유형의 데이터베이스가 사용될지 사용자가 알 수 없고 데이터베이스가 언제 변경될 수 있는지 알 수 없는 경우. 3. 서버에 연결하기 위한 프레임워크를 설계하려면 "POP3", "IMAP", "HTTP" 세 가지 프로토콜이 필요합니다. 이 세 가지는 인터페이스를 공동으로 구현하기 위한 제품 범주로 사용할 수 있습니다.
참고: 클래스 생성 패턴으로 팩토리 메소드 패턴은 복잡한 객체를 생성해야 하는 모든 곳에서 사용할 수 있습니다. 한 가지 주의할 점은 복잡한 객체는 팩토리 패턴을 사용하는 데 적합하지만, 간단한 객체, 특히 new를 통해서만 생성할 수 있는 객체는 팩토리 패턴을 사용할 필요가 없다는 점입니다. 팩토리 패턴을 사용하는 경우 팩토리 클래스를 도입해야 하므로 시스템이 더 복잡해집니다.
구현
Shape 인터페이스와 Shape 인터페이스를 구현하는 엔터티 클래스를 만듭니다. 다음 단계는 팩토리 클래스 ShapeFactory를 정의하는 것입니다.
FactoryPatternDemo, 데모 클래스에서는 ShapeFactory를 사용하여 Shape 개체를 가져옵니다. 필요한 개체 유형을 가져오기 위해 정보(CIRCLE / RECTANGLE / SQUARE)를 ShapeFactory에 전달합니다.
1단계
인터페이스를 만듭니다.
Shape.java
public interface Shape { void draw(); }
2단계
인터페이스를 구현하는 엔터티 클래스를 만듭니다.
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
Square.java
public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } }
Circle.java
public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
3단계
주어진 정보를 바탕으로 엔터티 클래스의 객체를 생성하는 팩토리를 생성합니다.
ShapeFactory.java
public class ShapeFactory { //使用 getShape 方法获取形状类型的对象 public Shape getShape(String shapeType){ if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("CIRCLE")){ return new Circle(); } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ return new Rectangle(); } else if(shapeType.equalsIgnoreCase("SQUARE")){ return new Square(); } return null; } }
4단계
이 팩토리를 사용하여 유형 정보를 전달하여 엔터티 클래스의 개체를 가져옵니다.
FactoryPatternDemo.java
public class FactoryPatternDemo { public static void main(String[] args) { ShapeFactory shapeFactory = new ShapeFactory(); //获取 Circle 的对象,并调用它的 draw 方法 Shape shape1 = shapeFactory.getShape("CIRCLE"); //调用 Circle 的 draw 方法 shape1.draw(); //获取 Rectangle 的对象,并调用它的 draw 方法 Shape shape2 = shapeFactory.getShape("RECTANGLE"); //调用 Rectangle 的 draw 方法 shape2.draw(); //获取 Square 的对象,并调用它的 draw 方法 Shape shape3 = shapeFactory.getShape("SQUARE"); //调用 Square 的 draw 方法 shape3.draw(); } }
5단계
출력을 확인합니다.
아아아아