자바 디자인 모델 | 단순 공장 모델

6285 단어 디자인 모드
단순 공장 모드
간단 한 공장 모델 은 유형의 창설 모델 로 정적 공장 방법 모델 이 라 고도 부른다.간단 한 공장 모델 은 한 공장 대상 이 어떤 제품 류 의 실례 를 생산 할 것 인 지 를 결정 한다.
왜 간단 한 공장 모델 을 사용 합 니까?
이 유 는 간단 하 다.
A 대상 이 B 대상 을 호출 하려 면 가장 쉬 운 방법 은 바로 new 1 개 B 로 나 오 는 것 이다.이렇게 하면 한 가지 문제 가 있 습 니 다. 만약 에 C 류 와 B 류 가 같은 인터페이스 / 같은 클래스 에서 계승 된다 면 시스템 은 B 류 를 C 류 로 수정 해 야 합 니 다. 프로그램 은 A 류 코드 를 다시 써 야 합 니 다.프로그램 중 100 곳 에서 B 대상자 가 새로 생 겼 다 면 100 곳 을 수정 해 야 한다.
이것 이 바로 전형 적 인 코드 결합 도가 너무 높 아서 생 긴 '끌 어 당 겨 온몸 을 움 직 이 는 것' 이다.그래서 한 가지 방법 은 공장 IFactory, A 와 IFactory 를 결합 시 켜 모든 클래스 가 C 인 터 페 이 스 를 실현 하고 IFactory 에서 C 를 생산 하 는 실례 를 수정 하면 된다 는 것 이다.
단순 공장 모델 예시
과일 을 예 로 들 면:
public interface Fruit
{
    void grow();//   
    void harveset(); //   
    void plant();//   
}

사과 와 포도 두 종류 가 있 습 니 다.
public class Apple implements Fruit
{
    public void grow()
    {
        System.out.println("Apple.grow()");
    }

    public void harveset()
    {
        System.out.println("Apple.harveset()");
    }

    public void plant()
    {
        System.out.println("Apple.plant()");
    }
}

public class Grape implements Fruit
{
    public void grow()
    {
        System.out.println("Grape.grow()");
    }

    public void harveset()
    {
        System.out.println("Grape.harveset()");
    }

    public void plant()
    {
        System.out.println("Grape.plant()");
    }
}

한 정원사 가 각종 과일 을 전문 적 으로 생산 하 는 것 을 책임 진다.
public class Gardener
{
    public static Fruit getFruit(String fruit)
    {
        if ("apple".equalsIgnoreCase(fruit))
        {
            return new Apple();
        }
        else if ("grape".equalsIgnoreCase(fruit))
        {
            return new Grape();
        }
        else
        {
            return null;
        }
    }
}

과일 을 원 하 는 것 은 정원사 에 게 물 어보 면 된다.
public static void main(String[] args)
{
    Fruit fruit0 = Gardener.getFruit("APPLE");
    fruit0.grow();
    Fruit fruit1 = Gardener.getFruit("GRAPE");
    fruit1.harveset();
}

프로그램 이 이렇게 장점 을 쓰 면 다음 과 같다.
1. 사용자 가 직접 제품 을 생산 하지 않 고 자신 이 필요 로 하 는 물건 을 가 져 가 는 것 만 책임 지면 됩 니 다. 그러면 사용자 – > 제품 간 의 결합 도가 떨 어 집 니 다.
2. 코드 모듈 의 직책 이 더욱 명확 해 졌 습 니 다. 전문 적 으로 소비 하 는 모듈, 전문 적 으로 생산 하 는 모듈 이 있 습 니 다.
개선 하 다.
위의 코드 는 사용자 – > 제품 간 의 분 리 를 실 현 했 지만 문제 가 있 습 니 다. 공장 에 몇 가지 제품 이 있 는 지 모 르 기 때문에 매번 제품 을 추가 할 때마다 else if 지점 을 추가 해 야 합 니 다. 불편 하지 않 습 니까?그래서 우 리 는 또 하나의 방법 을 생각 했다. 바로 반사 이다. 정원 사 는 이렇게 수정 할 수 있다.
public class Gardener
{
    public static Fruit getFruit(String fruitPath) throws Exception
    {
        Class> c = Class.forName(fruitPath);
        return (Fruit)c.newInstance();       
    }
}

호출 된 곳 은 다음 과 같이 쓸 수 있 습 니 다:
public static void main(String[] args) throws Exception
{
    Fruit fruit0 = Gardener.getFruit("com.xrq.simplefactory.Apple");
    fruit0.grow();
    Fruit fruit1 = Gardener.getFruit("com.xrq.simplefactory.Grape");
    fruit1.harveset();
}

물론 이렇게 쓰 는 것 도 문제 가 있 습 니 다. 만약 에 어느 날 제 프로젝트 가 재 구성, 재 구성 경로, 가방 경 로 를 하려 면 예 를 들 어 애플 을 생산 하 는 곳 이 100 곳 이 있 는데 100 곳 을 수정 해 야 하지 않 겠 습 니까?물론 사용 하지 않 습 니 다. 다음 과 같은 세 가지 방법 이 있 습 니 다.
1. 인터페이스 FruitPath 를 작성 하고 상수 정의:
public interface FruitPath
{
    public final static String apple = "com.xrq.simplefactory.Apple";
    public final static String grape = "com.xrq.simplefactory.Grape";
}

2. 과일 과 클래스 경로 의 대응 관 계 를 정의 하 는 Fruit. properties 파일 을 작성 합 니 다.
Apple=com.xrq.simplefactory.Apple
Grape=com.xrq.simplefactory.Grape

3. 과일 과 클래스 경로 의 대응 관 계 를 정의 하 는 Fruit. xml 파일 을 작성 합 니 다.
com.xrq.simplefactory.Apple
com.xrq.simplefactory.Grape

첫 번 째 방식 은 말 하지 않 겠 습 니 다. 두 번 째 방식 은. properties 는 자바 가 가지 고 있 는 Properties 류 로 해석 할 수 있 습 니 다. 세 번 째 방식 은 xml 입 니 다. DOM4J 로 해석 할 수 있 습 니 다.이렇게 해서 내 가 나중에 과일의 경 로 를 수정 하고 서 류 를 수정 하면 된다.
디자인 모델 의 측면 에서 볼 때 이렇게 수정 하 는 것 도 큰 장점 이 있다.지금 은 내 가 과일 을 새로 늘 리 든 지 삭제 하 든 정원사 (류 공장) 는 변 하지 않 아 도 된다. 공장 에 내 가 어떤 과일 이 필요 한 지 알려 주면 된다. 공장 은 자연히 호출 자 에 게 돌아 갈 것 이다.이런 서법 도 Spring 의 기초 이다.
마지막 으로 간단 한 공장 모델 이나 공장 모델 의 관심 사 는 공장 에서 필요 한 종 류 를 어떻게 생산 하 느 냐 가 아니 라 제품 을 만 들 고 소비 제품 을 분리 하 는 데 있다 는 것 을 알 아 주 셨 으 면 좋 겠 습 니 다.앞에서 if... else if... else, 반 사 를 사용 한 적 이 있 습 니 다. 이런 방법 을 제외 하고 다른 방법 으로 제품 을 만 들 수 있 습 니 다. 예 를 들 어 구체 적 인 제품 의 표 지 를 전달 하고 이 표지 에 따라 데이터 베이스 에서 조회 할 수 있 습 니 다.
단순 공장 모델 자바 에서 의 응용 및 해석
앞으로 모든 글 은 가능 한 한 디자인 모델 이 자바 에서 의 응용 을 소개 할 것 이다. 왜냐하면 나 는 모든 디자인 모델 개발 자가 사용 할 수 있 는 기회 가 있다 고 생각 하지 않 지만 기 존의 코드 에서 이것 이 어떤 디자인 모델 인지 예민 하 게 알 수 있 고 적어도 이런 디자인 모델 에 대해 이해 했다 는 것 을 설명 할 수 있 기 때문이다.여기 서 JDK 의 간단 한 공장 모델 을 말씀 드 리 겠 습 니 다.
JDK 의 간단 한 공장 모델 은 많은 응용 이 있 는데 전형 적 인 예 를 들 어 스 레 드 탱크 와 같다. 구체 적 으로 자바 다 중 스 레 드 18: 스 레 드 탱크 를 참조 할 수 있다.스 레 드 풀 을 사용 할 때 ThreadPoolExecutor 를 사용 할 수 있 습 니 다. 자신의 취향 에 따라 core PoolSize, maximum PoolSize, keepAliveTimem, unit, work Queue, threadFactory, handler 라 는 몇 가지 인 자 를 전달 하고 new 는 지정 한 ThreadPoolExecutor 를 만 듭 니 다.
JDK 는 개발 자 에 게 Executors 라 는 종 류 를 제공 하여 사용자 로 하여 금 ThreadPoolExecutor 를 만 들 고 ThreadPoolExecutor 를 사용 하여 분리 할 수 있 습 니 다. 예 를 들 어 Executors 에 게 단일 스 레 드 풀 Executors. new Single ThreadExecutor () 를 제공 하고 Executors 에 게 경계선 없 는 풀 Executors. new Cached ThreadPool () 을 제공 하 게 하 는 등 입 니 다.개발 자 는 스 레 드 탱크 가 어떻게 실현 되 는 지 에 관심 을 가지 지 않 고 Executors 방법 으로 개발 자 에 게 제공 하 는 Thread PoolExecutor 를 직접 사용 하면 됩 니 다.
공장 모델 의 장단 점
장점:
1. 소프트웨어 체계 구 조 를 간단하게 최적화 하고 각자 의 기능 모듈 의 직책 과 권 리 를 명 확 히 했다.
2. 공장 류 를 통 해 외부 에서 구체 적 인 제품 대상 을 직접 만 들 필요 가 없고 소 비 를 책임 져 야 하 며 내부 에서 대상 을 어떻게 만 드 는 지 에 관심 을 가 질 필요 가 없다.
단점:
1. 개선 하기 전의 간단 한 공장 모델 의 모든 설립 논 리 는 한 공장 류 에 집중 되 어 있 습 니 다. 만 들 수 있 는 종 류 는 고려 할 수 밖 에 없습니다. 새로운 종 류 를 추가 하려 면 공장 류 를 바 꿔 야 합 니 다.
2. 개선 전의 간단 한 공장 모델 은 구체 적 인 제품 이 계속 증가 함 에 따라 공 산 류 가 서로 다른 조건 에 따라 서로 다른 사례 를 만 드 는 수요 가 나타 날 수 있 습 니 다. 이런 조건 에 대한 판단 과 구체 적 인 제품 유형 에 대한 판단 이 교차 되 어 기능 모듈 의 확산 을 피하 기 어렵 고 시스템 의 유지 와 확장 에 불리 합 니 다.
3. 개 선 된 간단 한 공장 모델 은 주로 반사 효율 이 낮 습 니 다.
글 은 다음 과 같이 전 재 됩 니 다.https://www.cnblogs.com/xrq730/p/4902597.html

좋은 웹페이지 즐겨찾기