Java 8의 Lambda 표현식을 사용하여 공장 모드 구현

앞말
공장 모델은 대상을 대상으로 하는 디자인 모델 중 모두가 가장 잘 아는 디자인 모델 중의 하나다.전통적인 실현 방식은 모두가 익숙해지고 있습니다. 오늘은 자바8 Lambda 표현식을 사용하여 더욱 우아한 실현 공장 모델을 소개하겠습니다.
커버
공장 모델은java에서 가장 자주 사용하는 디자인 모델 중 하나로 좋은 실례화 대상을 제공하는 방법을 제공하고 new 조작을 대체하는 모델이 자주 사용하는 방식이다.공장 설계 모델은 실례화된 대상의 논리를 클라이언트에게 노출시키지 않아도 된다.
다음 글에서 저는 전통적인 코드를 사용하여 공장 모델을 실현하는 예를 제시한 다음에 Java8 Lambada 방식으로 다시 실현할 것입니다
하나의 예
우선 Shape 인터페이스와 몇 가지 실현 클래스를 만들고 다음 단계에서 ShapeFactory를 실현하며 마지막으로 상세한 호출 실례를 제시하고 결과를 출력할 것입니다.
새 인터페이스:Shape.java

public interface Shape {
 void draw();
}
두 Shape의 구현 클래스를 정의합니다: Circle.java & Rectangle.java

public class Rectangle implements Shape {
 @Override
 public void draw() {
  System.out.println("Inside Rectangle::draw() method.");
 }
}
public class Circle implements Shape {
 @Override
 public void draw() {
  System.out.println("Inside Circle::draw() method.");
 }
}
Shape의 공장 클래스를 생성하고 지정된 매개변수에 따라 다른 Shape를 반환하는 공장 방법을 구현합니다.

public class ShapeFactory {
 //use getShape method to get object of type shape 
 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();   
  }  
  return null;
 }
}
ShapeFactory는 전송된 shapeType에 따라 다른 Shape을 반환합니다.
다음은 구체적으로 사용한 예이다.

public class FactoryPatternDemo {
 public static void main(String[] args) {
  ShapeFactory shapeFactory = new ShapeFactory();
  //get an object of Circle and call its draw method.
  Shape shape1 = shapeFactory.getShape("CIRCLE");
  //call draw method of Circle
  shape1.draw();
  //get an object of Rectangle and call its draw method.
  Shape shape2 = shapeFactory.getShape("RECTANGLE");
  //call draw method of Rectangle
  shape2.draw();
 }
}
프로그램 출력

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Lambada를 사용하여 공장 모드 구현
Lambda 표현식은 익명 방법을 정의하고 함수식 인터페이스로 사용할 수 있도록 합니다.우리도 기존의 방법에서 같은 특성을 실현할 수 있기를 바란다.
방법 인용과lambda 표현식은 같은 특성을 가지고 있다. (예를 들어 목표 유형이 필요하고 함수식 인터페이스로 전환되는 실례가 필요하다.) 그러나 우리는 방법 인용에 방법체를 제공할 필요가 없다. 우리는 방법 명칭을 통해 기존의 방법을 직접 인용할 수 있다.
다음 예는 구조 방법의 인용을 보여 주었다

Supplier circleSupplier = Circle::new;
Circle circle = circleSupplier.get();
구조 방법 인용의 원리에 따라 우리는 이전의 코드를 다시 쓰고 맵을 정의하여shapename과 그에 대응하는 구조 방법 인용을 저장할 수 있다.

final static Map<String, Supplier> map = new HashMap<>();
 static {
 map.put("CIRCLE", Circle::new);
 map.put("RECTANGLE", Rectangle::new);
 }
이제 우리는 이 맵을 사용하여 서로 다른shapes를 실례화할 수 있다

public class ShapeFactory {
 final static Map<String, Supplier> map = new HashMap<>();
 static {
 map.put("CIRCLE", Circle::new);
 map.put("RECTANGLE", Rectangle::new);
 } 
 public Shape getShape(String shapeType){
  Supplier shape = map.get(shapeType.toUpperCase());
  if(shape != null) {
  return shape.get();
  }
  throw new IllegalArgumentException("No such shape " + shapeType.toUpperCase());
 }
}
lambada 표현식으로 구현된 공장 방법을 사용하여 shape 대상을 만듭니다.
FactoryPatternDemo.java

public class FactoryPatternDemo {
 public static void main(String[] args) {
  Supplier shapeFactory = ShapeFactory::new;
  //call draw method of circle
  shapeFactory.get().getShape("circle").draw();
  //call draw method of Rectangle
  shapeFactory.get().getShape("rectangle").draw();  
 }
}
프로그램 출력

Inside Circle::draw() method.
Inside Rectangle::draw() method.
여기 Shape:::new는 lambda 표현식의 약자로 볼 수 있습니다.비록 방법 인용이 반드시 (예를 들어 이 예에서) 문법을 더욱 치밀하게 바꾸는 것은 아니지만, 그것은 더욱 명확한 의미를 가지고 있다. 만약 우리가 호출하고자 하는 방법이 이름을 가지고 있다면, 우리는 그 이름을 통해 직접 호출할 수 있다.
만약 Shape 구조 함수에 여러 개의 매개 변수가 필요하다면, 당신은 자신의 Supplier를 다시 실현해야 합니다
예:

() -> new Circe(args)
총결산
이상은 바로 이 글의 전체 내용입니다. 본고의 내용이 여러분의 학습이나 업무에 일정한 도움을 줄 수 있기를 바랍니다. 만약에 의문이 있으면 여러분은 댓글을 남겨 교류할 수 있습니다. 저희에 대한 지지에 감사드립니다.

좋은 웹페이지 즐겨찾기