추상 공장 패턴
추상 팩토리 패턴은 슈퍼 팩토리 주변에 다른 팩토리를 만드는 패턴입니다. 기가팩토리는 다른 공장 중의 공장이라고도 불립니다. 이러한 유형의 디자인 패턴은 객체를 생성하는 최적의 방법을 제공하는 생성 패턴입니다.
추상 팩토리 패턴에서 인터페이스는 클래스를 명시적으로 지정하지 않고 관련 객체를 생성하는 역할을 담당하는 팩토리입니다. 생성된 각 팩토리는 팩토리 패턴에 따라 개체를 제공할 수 있습니다.
소개
의도: 구체적인 클래스를 지정하지 않고 일련의 관련되거나 상호 의존적인 개체를 생성하기 위한 인터페이스를 제공합니다.
주로 해결: 인터페이스 선택 문제를 주로 해결합니다.
사용 시기: 시스템의 제품에는 둘 이상의 제품군이 있으며 시스템은 제품군 중 하나의 제품만 소비합니다.
해결 방법: 한 제품군에 여러 제품을 정의합니다.
키 코드: 여러 개의 유사한 제품을 한 공장에 모아 놓습니다.
적용 예시: 일을 마치고 일부 파티에 참석하려면 비즈니스 의류(완전한 세트, 일련의 특정 제품), 패션 의류(완전한 세트, 일련의 특정 제품), 심지어 가족을 위한 비즈니스 여성 의류, 비즈니스 남성 의류, 패션 여성 의류, 패션 남성 의류가 있을 수 있습니다. 이들은 또한 완전한 세트, 즉 일련의 특정 제품입니다. 제품. (현실에 존재하지 않는 상황, 그렇지 않으면 공산주의에 들어갈 방법이 없지만 추상적인 공장 모델을 설명하는 것이 도움이 됩니다.) 가정에서 특정 옷장(콘크리트 공장)은 특정 종류만 보관할 수 있습니다. 이러한 옷(세트, 특정 제품 시리즈) 중에서 이 옷 세트를 집을 때마다 자연스럽게 이 옷장에서 꺼내게 됩니다. OO 사고를 사용하여 모든 옷장(콘크리트 공장)은 옷장(추상 공장)이고 각 옷 세트에는 특정 상의(특정 제품), 바지(특정 제품) 제품)가 포함되어 있으며 이러한 콘크리트 상의는 실제로 상의(특정 제품)임을 이해합니다. 추상물), 콘크리트 바지도 바지(또 다른 추상물)이다.
장점: 한 제품군의 여러 개체가 함께 작동하도록 설계하면 클라이언트는 항상 동일한 제품군의 개체만 사용할 수 있습니다.
단점: 제품군 확장이 매우 어렵습니다. 시리즈의 특정 제품을 추가하려면 특정 제품뿐만 아니라 추상 Creator에도 코드를 추가해야 합니다.
사용 시나리오: 1. QQ에서 스킨을 변경하고, 전체 세트를 함께 변경합니다. 2. 다양한 운영 체제용 프로그램을 생성합니다.
참고: 제품군은 확장하기 어렵지만 제품 수준은 확장하기 쉽습니다.
구현
Shape 및 Color 인터페이스와 이러한 인터페이스를 구현하는 엔터티 클래스를 만듭니다. 다음 단계는 추상 팩토리 클래스 AbstractFactory를 만드는 것입니다. 그런 다음 AbstractFactory를 확장하는 팩토리 클래스 ShapeFactory 및 ColorFactory를 정의합니다. 그런 다음 팩토리 생성자/생성기 클래스 FactoryProducer를 만듭니다.
AbstractFactoryPatternDemo, 데모 클래스는 FactoryProducer를 사용하여 AbstractFactory 개체를 얻습니다. 필요한 개체 유형을 가져오기 위해 모양 정보 Shape(CIRCLE / RECTANGLE / SQUARE)를 AbstractFactory에 전달합니다. 또한 필요한 개체 유형을 가져오기 위해 색상 정보 Color(RED / GREEN / BLUE)를 AbstractFactory에 전달합니다.
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단계
색상에 대한 인터페이스를 만듭니다.
Color.java
public interface Color { void fill(); }
4단계
인터페이스를 구현하는 엔터티 클래스를 만듭니다.
Red.java
public class Red implements Color { @Override public void fill() { System.out.println("Inside Red::fill() method."); } }
Green.java
public class Green implements Color { @Override public void fill() { System.out.println("Inside Green::fill() method."); } }
Blue.java
public class Blue implements Color { @Override public void fill() { System.out.println("Inside Blue::fill() method."); } }
5단계
Color 및 Shape 객체에 대한 추상 클래스를 생성하여 팩토리를 얻습니다.
AbstractFactory.java
public abstract class AbstractFactory { abstract Color getColor(String color); abstract Shape getShape(String shape) ; }
6단계
주어진 정보를 기반으로 엔터티 클래스의 개체를 생성하기 위해 AbstractFactory를 확장하는 팩토리 클래스를 만듭니다.
ShapeFactory.java
public class ShapeFactory extends AbstractFactory { @Override 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; } @Override Color getColor(String color) { return null; } }
ColorFactory.java
public class ColorFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ return null; } @Override Color getColor(String color) { if(color == null){ return null; } if(color.equalsIgnoreCase("RED")){ return new Red(); } else if(color.equalsIgnoreCase("GREEN")){ return new Green(); } else if(color.equalsIgnoreCase("BLUE")){ return new Blue(); } return null; } }
7단계
공장 생성 생성 모양이나 색상 정보를 전달하여 팩토리를 가져오는 생성기/생성기 클래스입니다.
FactoryProducer.java
public class FactoryProducer { public static AbstractFactory getFactory(String choice){ if(choice.equalsIgnoreCase("SHAPE")){ return new ShapeFactory(); } else if(choice.equalsIgnoreCase("COLOR")){ return new ColorFactory(); } return null; } }
8단계
FactoryProducer를 사용하여 AbstractFactory를 가져오고 유형 정보를 전달하여 엔터티 클래스의 객체를 가져옵니다.
AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo { public static void main(String[] args) { //获取形状工厂 AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); //获取形状为 Circle 的对象 Shape shape1 = shapeFactory.getShape("CIRCLE"); //调用 Circle 的 draw 方法 shape1.draw(); //获取形状为 Rectangle 的对象 Shape shape2 = shapeFactory.getShape("RECTANGLE"); //调用 Rectangle 的 draw 方法 shape2.draw(); //获取形状为 Square 的对象 Shape shape3 = shapeFactory.getShape("SQUARE"); //调用 Square 的 draw 方法 shape3.draw(); //获取颜色工厂 AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR"); //获取颜色为 Red 的对象 Color color1 = colorFactory.getColor("RED"); //调用 Red 的 fill 方法 color1.fill(); //获取颜色为 Green 的对象 Color color2 = colorFactory.getColor("Green"); //调用 Green 的 fill 方法 color2.fill(); //获取颜色为 Blue 的对象 Color color3 = colorFactory.getColor("BLUE"); //调用 Blue 的 fill 方法 color3.fill(); } }
9단계
출력을 확인합니다.
아아아아