CodeGym/Java Blog/무작위의/공장 디자인 패턴
John Squirrels
레벨 41
San Francisco

공장 디자인 패턴

무작위의 그룹에 게시되었습니다
회원
안녕 친구! 오늘 우리는 디자인 패턴을 계속 공부할 것입니다. 이번 수업에서는 공장에 대해 이야기할 것입니다. 이 패턴이 해결하는 문제에 대해 논의하고 공장이 커피숍을 여는 데 어떻게 도움이 되는지 예를 살펴보겠습니다. 또한 공장을 만드는 간단한 5단계를 알려드리겠습니다. 공장 디자인 패턴 - 1 우리 모두가 같은 파장에 있고 이 개념을 빠르게 이해하려면 다음 주제에 대해 잘 알고 있어야 합니다.
  • 자바의 상속
  • Java에서 참조 유형의 축소 및 확장
  • 다른 클래스와 개체 간의 상호 작용.

공장이란 무엇입니까?

팩토리 디자인 패턴을 사용하면 개체 생성을 제어할 수 있습니다. 새로운 객체를 생성하는 과정은 아주 간단하지는 않지만 지나치게 복잡하지도 않습니다. 우리 모두는 new새 개체를 생성하기 위해 연산자가 필요하다는 것을 알고 있습니다. 아마도 여기에는 제어할 것이 없는 것처럼 보이지만 사실이 아닙니다. 애플리케이션에 많은 자손이 있는 특정 클래스가 있다고 가정합니다. 특정 조건에 따라 특정 클래스의 인스턴스를 생성해야 하는 경우 어려움이 발생할 수 있습니다. 팩토리 특정 조건에 따라 다양한 객체를 생성하는 문제를 해결하는 데 도움이 되는 디자인 패턴입니다. 추상적인 개념은 어떻습니까? 아래 예를 보면 더 명확하고 구체적으로 알 수 있습니다.

다양한 종류의 커피를 준비하자

커피숍을 자동화하고 싶다고 가정해 보겠습니다. 우리는 프로그램에 다양한 종류의 커피를 만드는 방법을 가르쳐야 합니다. 이를 위해 아메리카노, 카푸치노, 에스프레소, 라떼 등 준비할 커피 유형을 나타내는 커피 클래스와 몇 가지 파생 클래스를 만듭니다. 일반적인 커피 수업부터 시작하겠습니다.
public class Coffee {
    public void grindCoffee(){
        // Grind the coffee
    }
    public void makeCoffee(){
        // Brew the coffee
    }
    public void pourIntoCup(){
        // Pour into a cup
    }
}
다음으로 자식 클래스를 만듭니다.
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
고객은 모든 종류의 커피를 주문할 수 있습니다. 그들의 명령은 프로그램에 전달되어야 합니다. 예를 들어 String. 그러나 an이 enum이에 가장 적합합니다. enum주문할 수 있는 커피 유형에 해당하는 열거형 필드를 만들고 정의합니다.
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
엄청난. 이제 커피숍의 코드를 작성해 보겠습니다.
public class CoffeeShop {

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucсino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
orderCoffee방법은 두 부분으로 나눌 수 있습니다.
  1. 문 에서 커피의 특정 인스턴스 생성 switch. 이것은 팩토리가 하는 일을 하는 곳입니다. 조건에 따라 특정 유형을 생성합니다.
  2. 준비 — 이것은 갈고, 양조하고, 컵에 붓는 것입니다.
향후 방법을 변경해야 하는 경우 알아야 할 중요한 사항은 다음과 같습니다.
  1. 준비 자체와 관련된 단계(갈기, 양조 및 컵에 붓기)는 변경되지 않은 상태로 유지됩니다(적어도 우리는 이것을 믿고 있습니다).
  2. 그러나 커피의 구색은 변경될 수 있습니다. 아마도 우리는 모카를 만들기 시작할 것입니다... 프라푸... 모카치... 어쨌든, 새로운 종류의 커피.
우리는 미래에 메서드의 문을 변경해야 할 것이라고 이미 상당히 확신할 수 있습니다 switch. 또한 우리 커피숍에서 orderCoffee다양한 유형의 커피를 만드는 방법이 유일한 장소가 아닐 수도 있습니다. 결과적으로 여러 곳에서 변경해야 합니다. 당신은 아마 내가 무엇을 얻고 있는지 이미 이해하고 있을 것입니다. 리팩토링이 필요합니다. 두 가지 이유로 커피 생성을 담당하는 블록을 별도의 클래스로 이동합니다.
  1. 다른 곳에서 커피 만들기 논리를 재사용할 수 있습니다.
  2. 구색이 변경되면 커피가 생성되는 모든 곳에서 코드를 편집할 필요가 없습니다. 한 곳에서 코드를 변경하는 것으로 충분합니다.
즉, 공장을 세울 때가 된 것입니다.

첫 번째 공장 설립

이를 위해 커피 클래스의 필수 인스턴스 생성을 담당하는 새 클래스를 생성합니다.
public class SimpleCoffeeFactory {
    public Coffee createCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        return coffee;
    }
}
축하해요! 우리는 공장 설계 패턴을 가장 단순한 형태(거의)로 구현했습니다. 메서드를 정적 으로 만들면 더 간단할 수 있습니다 createCoffee. 하지만 그러면 두 가지 기능이 손실됩니다.
  1. SimpleCoffeeFactory메서드를 상속하고 재정의하는 기능 createCoffee.
  2. 필요한 팩토리 구현을 클래스에 추가하는 기능.
그건 그렇고, 구현에 대해 말하자면... 커피숍으로 돌아가서 커피 제조 공장을 추가해야 합니다.

커피숍에 공장을 더하다

팩토리를 사용하여 커피숍 클래스를 다시 작성해 보겠습니다.
public class CoffeeShop {

    private final SimpleCoffeeFactory coffeeFactory;

    public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
        this.coffeeFactory = coffeeFactory;
    }

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = coffeeFactory.createCoffee(type);
        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
훌륭한. 이제 팩토리 디자인 패턴의 일반적인 구조에 대한 간결한 설명을 제공하겠습니다.

나만의 공장을 여는 5단계

1단계. 프로그램에는 아래 다이어그램과 같이 여러 하위 항목이 있는 클래스가 있습니다. 2단계 . 각 하위 클래스에 대한 필드가 있는 를 공장 디자인 패턴 - 2만듭니다 .enum
enum CatType {
    LION,
    TIGER,
    FLUFFY
}
3단계. 공장을 짓습니다. 그것을 부르십시오 CatFactory. 코드는 다음과 같습니다.
class CatFactory {}
4단계. 팩터리에서 인수를 createCat사용하는 메서드를 만듭니다 CatType. 코드는 다음과 같습니다.
class CatFactory {
    public Cat createCat(CatType type) {

    }
}
5단계. 메서드 본문에서 switchenum 필드를 열거하고 전달된 enum값에 해당하는 클래스의 인스턴스를 만드는 문을 작성합니다.
class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;

            switch (type) {
                case LION:
                    cat =  new Fluffy();
                    break;
                case TIGER:
                    cat = new Tiger();
                    break;
                case FLUFFY:
                    cat =  new Lion();
                    break;
            }

            return cat;
        }
    }
이제 사장처럼 공장을 운영할 수 있습니다. :)

연습 방법

읽기도 좋고 코드 작성은 더 좋습니다. 이름의 글자 수가 짝수이면 나만의 가상 피자 가게를 만들어 보세요. 이름의 글자 수가 홀수인 경우 가상 스시 바를 만들어 보십시오. 이름이 없으면 운이 좋은 것입니다. 오늘은 쉴 수 있습니다.
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다