창설 형 설계 모델 의 간단 한 공장, 공장 방법 과 추상 적 인 공장 모델

11882 단어 디자인 모드
정의
공장 모델 (Factory Pattern) 은 창설 형 디자인 모델 에 속한다.만약 에 그 이름 이 실제 장면 에서 가공 공장 과 같은 형식 으로 클래스 대상 을 만 들 었 다 면 그 과정 은 클 라 이언 트 에 게 생 성 논 리 를 노출 시 키 지 않 고 공 통 된 인 터 페 이 스 를 사용 하여 새로 만 든 대상 을 되 돌려 줍 니 다.일반 공장 모델 은 간단 한 공장 모델 (Simple Factory), 공장 방법 모델 (Factory Method) 과 추상 적 인 공장 모델 (Abstract Factory) 로 나 눌 수 있다. 그 중에서 엄 밀 히 말 하면 간단 한 공장 은 표준 적 인 디자인 모델 이 아니 지만 공장 방법 과 추상 적 인 공장 은 모두 간단 한 공장 을 통 해 발전 되 었 다.
2 단순 공장 모델
간단 한 공장 모델 을 소개 하기 전에 우 리 는 먼저 현실 생활 의 진실 한 장면 을 구상 한다.만약 에 한 핸드폰 업 체 가 스마트 폰 과 스마트 워 치 두 가지 하드웨어 제품 을 생산 한다 고 가정 하면 우 리 는 코드 로 보통 이렇게 쓴다.
public class Phone {
    public void showInfo() {
        System.out.println("       !");
    }
}
public class Watch {
    public void showInfo() {
        System.out.println("         !");
    }
}
//      
public class Main {
    public static void main(String[] args){
        Phone phone = new Phone();
        phone.showInfo();
        Watch watch = new Watch();
        watch.showInfo();
    }
}

코드 는 현실 에 대한 이미지 이기 때문에 상기 코드 는 틀 리 지 않 습 니 다. 그러나 이러한 사 고 는 프로그램 으로 하여 금 현재 의 수 요 를 만족 시 키 기 위해 프로그램 을 유지 하고 확장 하 며 재 활용 하기 쉽 지 않 습 니 다.예 를 들 어 여러 제품 을 생산 하려 면 new 가 여러 번 나 와 야 하 는데 이런 노출 된 생 성 대상 은 충분히 포장 할 수 있다.또 휴대 전화 업 체 가 휴대 전화의 디자인 과 시스템 개선 에 전념 해 야 한다 면 이런 일 을 생산 하 는 것 은 대리 공장 에 맡 기 면 된다.
2.1 일반 단순 공장
그럼 간단 한 공장 모델 로 표현 하 는 것 이 어떤 지 살 펴 보 자.
휴대 전화 와 손목 시 계 는 모두 하드웨어 에 속 하기 때문에 그것들 을 추상적으로 추정한다.
public abstract class Hardware {
    public abstract void showInfo();
}
public class Phone extends Hardware {
    @Override
    public void showInfo() {
        System.out.println("       !");
    }
}
public class Watch extends Hardware {
    @Override
    public void showInfo() {
        System.out.println("         !");
    }
}

하드웨어 공장 종류:
public class HardwareFactory {
    public static Hardware createHardware(String hardwareName) {
        Hardware hardware = null;
        switch (hardwareName) {
            case "phone":
                hardware = new Phone();
                break;
            case "watch":
                hardware = new Watch();
                break;
            default:
                throw new UnsupportedOperationException("      ");
        }
        return hardware;
    }
}

호출 자:
public class Main {
    public static void main(String[] args){
        Hardware phone = HardwareFactory.createHardware("phone");
        phone.showInfo();
        Hardware watch = HardwareFactory.createHardware("watch");
        watch.showInfo();
    }
}

상기 코드 에서 핸드폰 과 시 계 는 모두 하드웨어 제품 에 속 하기 때문에 이 를 하드웨어 류 에 계승 해 야 한다. 클 라 이언 트, 즉 핸드폰 업 체 는 하드웨어 공장 에 명확 한 명령 만 내 려 야 한다. 나 는 핸드폰 이나 시계의 하드웨어 를 생산 하고 하드웨어 공장 의 createHardware 방법 으로 생 성 할 하드웨어 이름 을 입력 해 야 한다 고 말 했다.하드웨어 공장 은 명령 을 받 으 면 요구 에 따라 대응 하 는 하드웨어 제품 을 생산 할 것 이다.
2.2 다 중 방법 단순 공장
일반적인 간단 한 공장 은 하드웨어 를 생산 하 는 대외 적 인 방법 만 있 고 약 정 된 이름 을 받 아 해당 하 는 제품 을 생산 해 야 한 다 는 뚜렷 한 단점 이 있다. 그러면 클 라 이언 트 가 명령 이름 을 잘못 전달 하면 제품 대상 을 정확하게 만 들 지 못 한다. 이때 공장 류 를 개선 하여 어떤 제품 을 생산 할 수 있 는 지 명 확 히 할 수 있다.코드:
public class HardwareFactory {
    public static Hardware createPhone() {
        return new Phone();
    }
    public static Hardware createWatch() {
        return new Watch();
    }
}

호출 자:
public class Main {
    public static void main(String[] args){
        Hardware phone = HardwareFactory.createPhone();
        phone.showInfo();

        Hardware watch = HardwareFactory.createWatch();
        watch.showInfo();
    }
}

2.3 소결
간단 한 공장 은 같은 종류의 제품 을 분류 하여 대상 의 생산 과정 을 포장 하 는 것 으로 현실 적 인 상황 에 부합된다.또한 클 라 이언 트 는 정보 제품 만 책임 지고 제품 대상 을 직접 만 드 는 책임 을 면제 함으로써 각자 의 직책 과 권 리 를 명 확 히 하고 업무 장면 이 비교적 간단 할 때 코드 디자인 의 장점 도 잘 나타 낸다.
3 공장 방법 모델
상기 에서 말 한 바 와 같이 간단 한 공장 모델 은 업무 장면 이 비교적 간단 한 상황 이나 구체 적 인 제품 이 증가 하 는 경우 가 드물다.대상 이 복잡 한 업무 의 구체 적 인 제품 은 계속 증가 하 는 상황 에서 적합 하지 않다.
왜?위의 실제 장면 을 상상 해 보 세 요. 핸드폰 업 체 뒤에 스마트 가구, 예 를 들 어 스마트 전구, 스마트 텔레비전 등 을 생산 하기 시 작 했 을 때 그 코드 차원 에서 제품 부분 에 있어 매우 간단 합 니 다. 전구 나 텔레비전 류 를 만 들 고 하드웨어 추상 류 에 계승 하면 됩 니 다. 그러나 하드웨어 공장 에 우호 적 이지 않 습 니 다. 하드웨어 제품 을 추가 할 때마다하드웨어 공장 은 한 번 수정 을 해 야 한다. 이렇게 하면 새로운 업 무 를 위해 원래 의 안정 적 인 업무 에 영향 을 주기 쉽다.
하드웨어 공장 류 에서 모든 제품 사례 의 구축 에 집중 되 었 기 때문에 우 리 는 개발 과정 에서 뒤의 새로운 업무 장면 을 미리 고려 하지 못 했다. 공장 이 받 는 책임 이 너무 무 겁 고 자주 바 뀌 어서 모듈 기능 의 확산 을 피하 기 어렵 고 시스템 의 유지 와 확장 에 매우 불리 하 다. 이것 은 좋 은 방법 이 아니 라 개폐 원칙 에 위배 된다.
위 와 같은 상황 을 만 났 을 때 는 공장 방법 모델 로 해결 해 야 한다.공장 방식 모델 도 '다 중 공장 모델' 이 라 고 부른다.공장 의 다 태 는 공장 을 제품 류 처럼 추상 적 으로 개조 하고 모든 자 공장 이 대응 하 는 제품 의 창설 을 책임 지 는 것 이다.
핸드폰 과 시 계 는 하드웨어 추상 류 에 계승 되 고 간단 한 공장 과 마찬가지 로 변화 할 필요 가 없다.
public abstract class Hardware {
    public abstract void showInfo();
}
public class Phone extends Hardware {
    @Override
    public void showInfo() {
        System.out.println("       !");
    }
}
public class Watch extends Hardware {
    @Override
    public void showInfo() {
        System.out.println("         !");
    }
}

공장 을 인터페이스 로 추상 화하 다.
public interface IHardwareFactory {
    Hardware createHardware();
}
//      
public class PhoneFactory implements IHardwareFactory {
    @Override
    public Hardware createHardware() {
        return new Phone();
    }
}
//      
public class WatchFactory implements IHardwareFactory {
    @Override
    public Hardware createHardware() {
        return new Watch();
    }
}

호출 자:
public class Main {
    public static void main(String[] args){
        IHardwareFactory phoneFactory = new PhoneFactory();
        Hardware phone = phoneFactory.createHardware();
        phone.showInfo();

        IHardwareFactory watchFactory = new WatchFactory();
        Hardware watch = watchFactory.createHardware();
        watch.showInfo();
    }
}

3.1 소결
공장 방법 모델 은 간단 한 공장 모델 의 진일보 한 개선 판 이다. 간단 한 공장 모델 은 제품 을 하나의 공장 에서 추상 적 으로 만 들 고 수출 대상 을 만 들 었 고 공장 방법 모델 은 공장 을 더욱 추상 적 으로 여러 개의 공장 에서 해당 하 는 제품 대상 을 만 들 고 수출 했다.핵심 공장 류 는 모든 제품 의 창설 세부 사항 을 책임 지지 않 고 구체 적 인 서브 공장 에 반드시 실현 해 야 할 인 터 페 이 스 를 정의 하 는 것 만 책임 진다.이 때문에 공장 방법 모델 은 시스템 이 공장 을 수정 하지 않 은 상태 에서 신제품 의 확장 을 추가 할 수 있다.공장 방법 모델 은 설계 에 있어 서 개폐 원칙 에 완전히 부합된다.
물론 공장 방법 모델 도 뚜렷 한 단점 이 있다. 즉, 하나의 제품 을 추가 할 때마다 구체 적 으로 대응 하 는 서브 공장 을 추가 해 야 한 다 는 것 이다. 이 로 인해 시스템 에서 코드 량 이 증가 하고 일정한 절차 에서 도 시스템 의 복잡 도 를 증가 시 키 는 것 도 좋 은 일이 아니다.
4 추상 공장 모델
추상 적 인 공장 모델 을 소개 하기 전에 우 리 는 먼저 두 개념 을 이해한다.
제품 등급 구조: 등급 구 조 는 계승 구조 라 고도 부 르 기 때문에 제품 등급 구 조 는 바로 제품 의 계승 구조 이다.상기 휴대 전화의 예 에서 보 듯 이 휴대 전 화 는 추상 적 인 유형 이 고 그 자 류 는 MZ 휴대 전화, XM 휴대 전화, HW 휴대 전화 등 이 있다.추상 적 인 핸드폰 과 구체 적 인 브랜드 의 핸드폰 사이 에 제품 등급 구 조 를 구성 했다. 추상 적 인 핸드폰 은 부류 이 고 구체 적 인 브랜드 의 핸드폰 은 그 부류 이다.손목시계
제품 족: 서로 다른 제품 등급 구조 에서 관련 제품 으로 구 성 된 가족 입 니 다.또한 상기 예시 에서 MZ 업 체 는 휴대 전화 와 시 계 를 생산 했 고 다른 업 체 XM, HW 등 도 휴대 전화 와 시 계 를 생산 했다.MZ 휴대 전 화 는 휴대 전화 제품 등급 구조 에, MZ 시 계 는 시계 제품 등급 구조 에 있다.한편, MZ 폰 과 MZ 시 계 는 MZ 제품 족 을 구성 했다. 마찬가지 로 XM 폰 과 XM 시 계 는 XM 제품 족 을 구성 하고 HW 폰 과 HW 시 계 는 HW 제품 족 을 구성 했다.
 
간단 한 공장 모델 은 제품 등급 구 조 를 도입 했다. 그 계승 관 계 는 하드웨어 와 핸드폰, 시계 이 고 공장 방법 모델 은 이 를 바탕 으로 해당 하 는 공장 등급 구 조 를 도입 하여 간단 한 공장 모델 에서 공장 류 의 직책 이 너무 무 거 운 문 제 를 해결 했다. 제품 이 매우 많 을 때 이에 대응 하 는 공장 류 가 대량으로 나타난다.업무 논리 가 복잡 해 지면 하나 이상 의 제품 족 이 나타 날 때 공장 방식 을 계속 사용 하면 상상 할 수 없 는 많은 공장 류 가 나타 날 것 이다. 추상 적 인 공장 모델 은 바로 제품 등급 구조 와 제품 족 이 존재 하 는 공장 모델 의 진화 버 전 을 해결 하 는 것 이다.
하드웨어 클래스 는 최상 위 추상 클래스 입 니 다.
public abstract class Hardware {
    public abstract void showInfo();
}
//         
public abstract class Phone extends Hardware {
    public abstract void slogan();
}
//         
public abstract class Watch extends Hardware {
    public abstract void slogan();
}

제품 족의 실제 제품:
// MZ   
public class MzPhone extends Phone {
    @Override
    public void showInfo() { System.out.println("Mz       !"); }
    @Override
    public void slogan() { System.out.println("Mz        !"); }
}
public class MzWatch extends Watch {
    @Override
    public void showInfo() { System.out.println("Mz         !"); }
    @Override
    public void slogan() { System.out.println("Mz        !"); }
}
// XM   
public class XmPhone extends Phone {
    @Override
    public void showInfo() { System.out.println("Xm       !"); }
    @Override
    public void slogan() { System.out.println("Xm          !"); }
}
public class XmWatch extends Watch {
    @Override
    public void showInfo() { System.out.println("Xm         !"); }
    @Override
    public void slogan() { System.out.println("Xm          !"); }
}
// HW   
public class HwPhone extends Phone {
    @Override
    public void showInfo() { System.out.println("Hw       !"); }
    @Override
    public void slogan() { System.out.println("Hw         !"); }
}
public class HwWatch extends Watch {
    @Override
    public void showInfo() { System.out.println("Hw         !"); }
    @Override
    public void slogan() { System.out.println("Hw         !"); }
}

공장:
//            ,     
public interface IHardwareFactory {
    Hardware createPhone();
    Hardware createWatch();
}
// MZ     ,           
public class MzHardwareFactory implements IHardwareFactory {
    @Override
    public Phone createPhone() {
        return new MzPhone();
    }
    @Override
    public Watch createWatch() {
        return new MzWatch();
    }
}
// XM     ,           
public class XmHardwareFactory implements IHardwareFactory {
    @Override
    public Phone createPhone() {
        return new XmPhone();
    }
    @Override
    public Watch createWatch() {
        return new XmWatch();
    }
}
// HW     ,           
public class HwHardwareFactory implements IHardwareFactory {
    @Override
    public Phone createPhone() {
        return new HwPhone();
    }
    @Override
    public Watch createWatch() {
        return new HwWatch();
    }
}

 호출 자:
public class Main {
    public static void main(String[] args){
        MzHardwareFactory mzHardwareFactory = new MzHardwareFactory();
        Phone mzPhone = mzHardwareFactory.createPhone();
        mzPhone.showInfo();
        mzPhone.slogan();
        Watch mzWatch = mzHardwareFactory.createWatch();
        mzWatch.showInfo();
        mzWatch.slogan();

        XmHardwareFactory xmHardwareFactory = new XmHardwareFactory();
        Phone xmPhone = xmHardwareFactory.createPhone();
        xmPhone.showInfo();
        xmPhone.slogan();
        Watch xmWatch = xmHardwareFactory.createWatch();
        xmWatch.showInfo();
        xmWatch.slogan();

        HwHardwareFactory hwHardwareFactory = new HwHardwareFactory();
        Phone hwPhone = hwHardwareFactory.createPhone();
        hwPhone.showInfo();
        hwPhone.slogan();
        Watch hwWatch = hwHardwareFactory.createWatch();
        hwWatch.showInfo();
        hwWatch.slogan();
    }
}

출력 결과:
Mz       !
Mz        !
Mz         !
Mz        !

Xm       !
Xm          !
Xm         !
Xm          !

Hw       !
Hw         !
Hw         !
Hw         !

4.1 소결
추상 적 인 공장 모델 에서 모든 공장 에서 한 제품 족 을 통일 적 으로 관리 하고 한 공장 에서 서로 다른 제품 등급 구조의 제품 을 생산 한다.사실은 더욱 솔직히 말하자면 추상 적 인 공장 은 제품 족 관계 가 존재 할 때 간단 한 공장 모델 과 공장 방법 모델 을 결합 시 켜 제품 족 을 구분 하 는 여러 개의 간단 한 공장 모델 을 형성 하 는 것 이다.추상 적 인 공장 모델 은 제품 족 을 새로 늘 릴 때 개폐 원칙 에 부합 되 고 공장 방법 모델 은 구체 적 인 제품 을 새로 늘 릴 때 해당 하 는 제품 의 공장 을 늘 리 는 것 이 며 추상 적 인 공장 모델 은 제품 족 을 새로 늘 릴 때 만 공장 을 새로 늘 려 야 한다.
그러나 추상 적 인 공장 모델 은 제품 등급 구 조 를 새로 늘 릴 때 모든 제품 족 공장 을 수정 해 야 한다. 예 를 들 어 예 를 들 어 스마트 텔레비전 제품 을 추가 하려 면 세 제품 족 공장 을 수정 해 야 하기 때문에 매우 나쁘다.그래서 우 리 는 프로그램의 개발 자로 서 가능 한 한 디자인 초기 에 미래 장면 을 많이 고려 해 야 한다. 그렇지 않 으 면 시스템 에 많은 수정 이 생 겨 유지 비용 을 증가 할 것 이다.
 

좋은 웹페이지 즐겨찾기