자바 디자인 모델 의 공장 모델, 추상 공장 모델 한 편 이면 충분 하 다.
29040 단어 디자인 모드
자바 의 디자인 모델 은 크게 세 가지 로 나 뉜 다.
디자인 모델 원칙
여러분 들 이 면접 을 볼 때 디자인 모델 같은 질문 을 많이 받 지 않 을 지 모 르 겠 어 요. 예 를 들 어 - 1. 자바 의 디자인 모델 을 아 세 요?
그 다음 에 '알 아, 디자인 모델 은 세 가지 유형 으로 나 뉜 다. 창설 형 모델, 구조 형 모델, 행위 형 모델, 23 가지 작은 유형 으로 나 뉜 다. 그 중에서 공장 방법 모델, 추상 공장 모델, 단일 모델 이 있다. 그러나 나 는 그 중의 세 가지 만 알 고 있다. 즉, 공장 방법 모델, 추상 공장 모델, 단일 모델 에 대해 잘 알 고 있 고 다른 것 은 자신 이 없다.
- 2.
그 다음 에 네가 말 하기 시작 했다. 그러면 내 가 먼저 공장 방법 모델 을 말 하고 공장 방법 모델 은 보통 으로 나 뉜 다. 여러 공장 의 것 은 정태 적 인 공장 방법 모델 도 있다. 사실은 그들 은 모두 공통점 이 하나 있다. 바로 여러 가지 유형 이 비슷 한 기능 을 실현 해 야 한 다 는 것 이다. 예 를 들 어 메 일 을 보 내 고 편 지 를 보 내 는 것 이다. 공장 모델 로 보면 같은 인 터 페 이 스 를 실현 하 는 것 이다.자신의 클래스 자체 에서 이 인터페이스의 각종 기능 을 실현 할 수 있 습 니 다. 사용 할 때 공장 류 를 호출 하면 됩 니 다. 구체 적 으로 어떤 대상 을 만 들 고 어떻게 만 드 는 지 상관 하지 않 아 도 됩 니 다.
그 다음 에 추상 적 인 공장 모델 이다. 사실은 추상 적 인 공장 모델 과 일반 공장 모델 은 특히 그 가 공장 류 를 분 리 했 을 뿐이다. 모든 대상 에 공장 이 하나 있 고 다른 인 터 페 이 스 를 만 들 었 다. 이런 공장 들 은 모두 이런 인 터 페 이 스 를 실현 했다.단일 모드
- 3. , , ?
공장 모드 는 결합 을 풀기 위해 서 입 니 다. 대상 의 생 성과 사용 과정 을 분리 합 니 다.클래스 A 가 클래스 B 를 호출 하려 면 B 를 호출 하 는 방법 일 뿐 B 의 실례 화 는 공장 류 에 맡긴다.
공장 모델 은 코드 의 중복 을 낮 출 수 있다.B 를 만 드 는 과정 이 매우 복잡 하고 일정한 코드 양 이 필요 하 며 많은 곳 에서 사용 해 야 한다 면 중복 코드 가 많 을 것 이다.이 창설 대상 B 의 코드 를 공장 에 넣 어 통일 적 으로 관리 할 수 있다.중복 코드 를 줄 일 뿐만 아니 라 앞으로 B 에 대한 유지보수 도 편리 합 니 다.
공장 모델 은 오 류 를 줄 일 수 있다. 공장 이 대상 의 창설 논 리 를 관 리 했 기 때문에 사용 자 는 구체 적 인 창설 과정 을 알 필요 가 없고 사용 만 하면 된다. 사용자 가 창설 논리 로 인 한 오 류 를 줄 일 수 있다.
- 4. ?
사실 공장 모델 의 한 역할 은 대상 을 만 드 는 것 이 고 창설 류 는 new (밑바닥 도 반 사 를 통 해 대상 을 만 드 는 것) 를 사용 할 수 있 지만 일부 상황 에서 공장 모델 을 사용 하 는 것 이 가장 적합 하 다.예 를 들 면
상황 1: 만약 에 한 대상 이 많은 하위 클래스 를 가지 고 있다 면 이 대상 을 만 드 는 하위 클래스 는 공장 모델 을 사용 하 는 것 이 가장 적합 하 다. 인터페이스 에 대한 프로 그래 밍 뿐만 아니 라 유지 와 개발 에 편 의 를 가 져 다 줄 수 있다.
상황 2: 대상 의 생 성 과정 / 실례 화 준비 작업 은 매우 복잡 하 다. 많은 초기 화 매개 변수 가 필요 하 다. 데이터 베 이 스 를 조회 하 는 등 평소에 개발 할 때 예 를 들 어 사용자 정의 로그 프레임 워 크, 데이터 베이스 연결 원 바 꾸 기, 사이트 의 스타일 테마 바 꾸 기 등 이다.
공장 모드
1 단순 공장 모델
public interface SendMessageInterface {
//
public void send();
}
@Service
public class MailSendImpl implements SendMessageInterface {
@Override
public void send() {
System.out.println("mail send");
}
}
@Service
public class PhoneSendImpl implements SendMessageInterface {
@Override
public void send() {
System.out.println("phone send");
}
}
단순 공장 모델 핵심 공장
public class MySimpleFactory {
public SendMessageInterface produce(String mes) {
if ("mail".equals(mes)) {
return new MailSendImpl();
} else if ("phone".equals(mes)) {
return new PhoneSendImpl();
} else {
System.out.println(" ");
return null;
}
}
}
public static void main(String[] args) {
MySimpleFactory factory = new MySimpleFactory();
SendMessageInterface sendMessageInterface = factory.produce("mail");
sendMessageInterface.send(); //
SendMessageInterface sendMessageInterface2 = factory.produce("phone");
sendMessageInterface2.send(); //
}
//mail send
//phone send
2 여 개 공장 모델
여러 공장 모델 은 일반 공장 방법 모델 에 대한 개선 이다. 일반 공장 방법 모델 에서 전달 하 는 문자열 이 잘못 되면 대상 을 정확하게 만 들 수 없고 여러 공장 방법 모델 은 여러 공장 방법 을 제공 하여 각각 대상 을 만 드 는 것 이다.
다 중 공장 모델 핵심 공장
public class MyManyFactory {
public MailSendImpl produceMail() {
return new MailSendImpl();
}
public PhoneSendImpl producePhone() {
return new PhoneSendImpl();
}
}
public static void main(String[] args) {
MyManyFactory myManyFactory=new MyManyFactory();
MailSendImpl mailSend=myManyFactory.produceMail();
PhoneSendImpl phoneSend=myManyFactory.producePhone();
mailSend.send();
phoneSend.send();
}
//mail send
//phone send
3 정적 공장 모드
위의 여러 공장 방법 모델 에서 의 방법 을 정적 으로 설정 하고 인 스 턴 스 를 만 들 지 않 고 직접 호출 하면 됩 니 다.
/**
* @author xiyou
* @version 1.0
* xiyou-todo
* @date 2020/5/10 11:51
*/
public class MyStaticFactory {
public static MailSendImpl produceMail() {
return new MailSendImpl();
}
public static PhoneSendImpl producePhone() {
return new PhoneSendImpl();
}
public static void main(String[] args) {
MailSendImpl mailSend = MyStaticFactory.produceMail();
PhoneSendImpl phoneSend = MyStaticFactory.producePhone();
mailSend.send();
phoneSend.send();
}
}
//mail send
//phone send
공장 모델 총화
전체적으로 보면 공장 모델 은 적당 하 다. 대량의 제품 이 만들어 야 하고 공 통 된 인 터 페 이 스 를 가 질 때 공장 방법 모델 을 통 해 만 들 수 있다.상기 세 가지 모델 에서 첫 번 째 는 들 어 오 는 문자열 이 잘못 되면 대상 을 정확하게 만 들 수 없고 세 번 째 는 두 번 째 모델 에 비해 인 스 턴 스 화학 공장 류 가 필요 하지 않 기 때문에 대부분 상황 에서 우 리 는 세 번 째 - 정적 공장 방법 모델 을 선택 할 것 이다.
공장 방법 모델 의 한 가지 문 제 는 유형의 설립 이 공장 류 에 의존 한 다 는 것 이다. 즉, 절 차 를 확대 하려 면 반드시 공장 류 를 수정 해 야 한다. 이것 은 폐쇄 원칙 에 위배 되 기 때문에 디자인 측면 에서 어느 정도 문제 가 있 으 면 어떻게 해결 해 야 하 는가?추상 적 인 공장 모델 을 사용 하여 여러 개의 공장 류 를 만 들 면 새로운 기능 이 필요 하면 새로운 공장 류 를 직접 추가 하면 되 고 이전의 코드 를 수정 할 필요 가 없다.
4 추상 공장 모델
여기 서 우 리 는 직접 인터페이스의 방식 으로 추상 적 인 공장 을 만 들 지만 추상 적 인 유형 도 사용 할 수 있다. 다음 에 우 리 는 먼저 인터페이스 방식 으로 추상 적 인 공정 모델 을 실현 한다.
인터페이스 방식 은 추상 적 인 공장 모델 을 실현 한다.
public interface AbstractFactoryInterface {
/**
*
*
* @return
*/
SendMessageInterface absFactoryProduce();
}
public class MailAbstractFactory implements AbstractFactoryInterface{
@Override
public SendMessageInterface absFactoryProduce() {
return new MailSendImpl();
}
}
public class PhoneAbstractFractory implements AbstractFactoryInterface {
@Override
public SendMessageInterface absFactoryProduce() {
return new PhoneSendImpl();
}
}
public class TestAbstractFactory {
public static void main(String[] args) {
AbstractFactoryInterface mailAbstractFactory = new MailAbstractFactory();
AbstractFactoryInterface phoneAbstractFractory = new PhoneAbstractFractory();
SendMessageInterface mail = mailAbstractFactory.absFactoryProduce();
mail.send();
SendMessageInterface phone = phoneAbstractFractory.absFactoryProduce();
phone.send();
}
}
//mail send
//phone send
추상 류 는 추상 적 인 공장 모델 을 실현 한다.
public abstract class AbstractFactoryClass {
/**
*
*
* @return
*/
public abstract SendMessageInterface absFactoryProduce();
}
public class MailAbstractFactoryClass extends AbstractFactoryClass {
@Override
public SendMessageInterface absFactoryProduce() {
return new MailSendImpl();
}
}
public class PhoneAbstractFractoryClass extends AbstractFactoryClass {
@Override
public SendMessageInterface absFactoryProduce() {
return new PhoneSendImpl();
}
}
public class TestAbstractFactoryClass {
public static void main(String[] args) {
MailAbstractFactoryClass mail = new MailAbstractFactoryClass();
MailAbstractFactoryClass phone = new MailAbstractFactoryClass();
mail.absFactoryProduce().send();
phone.absFactoryProduce().send();
}
}
인터페이스 와 추상 류 가 추상 적 인 공장 모델 을 실현 하 는 차 이 는 무엇 입 니까?
사실은 인터페이스 와 추상 류 의 차이 이다.
해답 주소
위 에 없 으 면 이것 을 볼 수 있 습 니 다: 전송 문
전송 문 안에 있 는 자바 베이스 에 있 습 니 다.
사실 이 모델 의 장점 은 만약 에 당신 이 지금 하나의 기능 을 추가 하고 싶다 면 신속 한 정 보 를 보 내 려 면 하나의 실현 류 를 만 들 고 일반적인 어느 공장 모델 의 인 터 페 이 스 를 실현 하면 된다 는 것 이다. 동시에 공장 류 를 만 들 고 추상 적 인 공장 모델 의 인 터 페 이 스 를 실현 하면 OK. 기 존의 코드 를 바 꿀 필요 가 없다.이렇게 하면 확장 성 이 비교적 좋다!
공장 모델 총화
1. 공장 모델 도 세 가지 가 포함 되 어 있 습 니 다. A: 간단 한 것: 한 공장 에 한 가지 방법 만 있 습 니 다. 사용 할 때 매개 변 수 를 입력 해 야 합 니 다. 매개 변수 에 따라 어떤 종류의 B 를 만 듭 니까? 한 공장 에 여러 가지 방법 으로 서로 다른 기능 을 실현 합 니 다.사용 할 때 서로 다른 인 터 페 이 스 를 호출 하면 됩 니 다. C: 정적 공장: B 와 의 차 이 는 공장 안의 N 가지 방법 이 모두 static 에 의 해 수정 되 었 습 니 다. 사용 할 때 인 스 턴 스 를 만 들 지 않 아 도 위의 선택 C 를 직접 호출 하 는 것 이 가장 좋 지만 ABC 든 좋 지 않 습 니 다. 매번 하나의 기능 이 추 가 될 때마다 공장 류 를 수정 해 야 하기 때 문 입 니 다.그래서 추상 적 인 공장 모델 2. 추상 적 인 공장 모델 을 도입 한다. 즉, 매번 에 하나의 기능 을 추가 할 때마다 하나의 유형 만 추가 하여 실현 하면 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.