23 개 자세한 디자인 패턴 (A) 자바 개발 팩토리 메소드 패턴과 추상 팩토리 패턴

직업 분류, 디자인 패턴

세 가지 범주로 전반적으로 디자인 패턴 :

팩토리 메소드 패턴, 추상 팩토리 패턴, 싱글, 빌더 패턴, 프로토 타입 모델 : 스키마, 다섯 개 가지 범주의 총을 만듭니다.

구조 모델 일곱 종류의 총 : 어댑터 모드, 장식 모드, 프록시 모드, 외관 모드, 브리지 모드, 복합 모드, 플라이급.

행동 패턴, 십일가지 총 : 전략 패턴, 템플릿 메소드 패턴, 관찰자 ​​모드, 반복자 패턴, 책임 체인 모드, 명령 모드, 메모 모드 상태 모드, 방문자 패턴, 중간 모델은 모드를 설명합니다.

동시성 패턴 및 스레드 풀 모드 : 사실, 두 가지 유형이 있습니다. 사진으로 전체를 설명합니다 :

여섯 개 원칙 둘째, 디자인 패턴

1, 개폐 원칙 (개방 - 폐쇄 원칙)

즉, 개방 및 폐쇄 연장 개방의 원리이지만, 변형 폐쇄. 프로그램을 확장해야하는 경우, 핫 스왑의 효과를 달성하기 위해 기존 코드를 수정하지. 프로그램 더 나은 확장 성, 유지 보수 및 업그레이드의 용이성을 위해 : 그래서 한 문장으로 요약. 이 효과를 달성하고자, 우리는 상세 설계를 수행 인터페이스와 추상 클래스를 사용해야합니다, 우리는이 점을 언급 할 것이다.

2 릭터 교체 원리 (리스 코프 치환 원칙)

리히터 대체 원칙 (리스 코프 치환 원칙 LSP) 객체 지향 설계의 기본 원칙 중 하나입니다. 모든 기본 클래스를 표시 할 수있는 장소에 리히터 대체 원리는, 서브 클래스는 표시 할 수 있습니다. LSP는 파생 클래스는 기본 클래스의 기초에 새로운 동작을 추가 할 수 있습니다, 기본 클래스를 대체 할 수있는 파생 클래스가, 기능의 소프트웨어 장치가 영향을받지 않는 경우에 초석 만, 기본 클래스는 정말 재사용 할 수 멀티플렉싱 상속 . 리히터 대체 원리는 - "온 - 오프"원칙을 추가 할 수 있습니다. 원칙적으로 추상화의 핵심 단계이다 - "폐쇄 개방는"달성하기 위해. 기본 클래스와 상속 관계는 추상적 인 구체적인 실현의 서브 클래스이기 때문에 리히터 대체 원칙은 추상적를 달성하기위한 구체적인 단계에 대한 사양입니다. - 바이두 백과 사전에서

3. 의존 관계 역전 원칙 (의존성 반전 원칙)

특정에 의존하지 않는 추상적에 따라 프로그래밍 인터페이스에 대한 사실,이 원칙은 개폐, 구체적인 내용의 기초가된다.

4, 인터페이스 분리의 원칙 (인터페이스 독방 원리)

인터페이스 분리의 복수, 단일 인터페이스를 사용하는 것보다 낫다 :이 원리는 것을 의미한다. 또는 클래스 간의 결합의 낮은 수준의 우리는 사실, 디자인 패턴을 업그레이드하기 위해 쉬운 유지 보수, 대규모 소프트웨어 아키텍처의 소프트웨어의 설계, 인, 볼 여기에서 의미한다. 따라서, 위의 여러 번 : 커플 링을 감소 의존도를 줄일 수 있습니다.

5, 데메테르의 법칙 (가장 알려진 원칙) (데메테르 원리)

적어도 알려진 원리를 호출 왜 그 말을하는 것입니다 : 엔티티는 엔티티와 다른, 같은 그 독립적 인 기능 모듈 사이의 상호 작용을 최소화해야한다.

6 다중화 원리의 합성 (합성 재사용 원리)

원리는 합성 고분자 정보 / 대신 상속을 사용하는 것입니다.

시작부터, 등 자신의 특성 원칙과 디자인 패턴과 결합 된 응용 프로그램 시나리오 등 23 개 디자인 패턴, 자바 케이스의 개념을 분석 하였다 세부 사항을 우리.

세, 자바23 개 디자인 패턴

시작부터, 등 자신의 특성 원칙과 디자인 패턴과 결합 된 응용 프로그램 시나리오 등 23 개 디자인 패턴, 자바 케이스의 개념을 분석 하였다 세부 사항을 우리.

1 , 팩토리 메소드 모델 ( 공장의 방법, )

공장 방법 패턴은 세 가지 유형으로 나누어 져 있습니다 :

11 , 일반 공장 모델은 , 팩토리 클래스를 구축하기 위해 동일한 인터페이스 클래스를 생성 된 인스턴스를 달성하는 것입니다. 먼저, 그림에서 보면 :

 

예를 들어 다음과 같이 :( 우리는 전자 메일 및 SMS를 전송하는 예를 제공)

첫째, 둘 사이에 공통적 인 인터페이스를 생성 :

 

[자바]보기 plaincopy

 1 공중  인터페이스 발신자 {  

 2      공개  공극 송신 ();  

삼. }  

둘째, 구현 클래스를 작성 :

[자바]보기 plaincopy

 1 공용  클래스 MailSender는 구현 발신자 {  

 2 . @Override  

 3.      공공  무효 보내기 () {  

 4에서 System.out.println는 ( "이 mailsender입니다!" );  

5 . }  

 6.}  
[자바]보기 plaincopy

 1 공용  클래스 SmsSender는 구현 발신자 {  

 2 .   

3 . @Override  

 4.      공공  무효 보내기 () {  

 5에서 System.out.println는 ( "이 SMS를 보낸 사람입니다!" );  

6 . }  

 7}

 

 

 

마지막으로, 공장 범주를 구축 :

 

[자바]보기 plaincopy

 1 공용  클래스 SendFactory {  

 2 .   

3.      공공 보낸 사람 생산 (문자열 형) {  

 4.          경우 ( "메일" .equals (유형)) {  

 5.              반환  새로운 MailSender ();  

6.} 다른  경우 ( "SMS" .equals (유형)) {  

 7.              반환  새로운 SmsSender ();  

8.} 다른 {  

 9에서 System.out.println는 ( "输入正确的类型请!" );  

10.                리턴  ;  

(11). }  

 (12) . }  

 13.}  

의 다음 테스트를 보자 :

1. 공공  클래스 FactoryTest {  

 2 .   

3.      공공  정적  무효 메인 (문자열 []에 args) {  

 제 SendFactory 공장 = 새로운 SendFactory ();  

5. 발신자 발신자 = factory.produce ( "SMS" );  

6 . sender.Send ();  

7 . }  

 8}

출력 :이 SMS를 보낸 사람입니다!

(22) , 패턴 공장에있어서의 복수 의 공장에있어서의 통상 모드에 비해 개선은, 정상 모드의 공장에있어서, 상기 전송 오류 문자열 경우, 오브젝트는 적절하게 만들어 질 수 없으며, 모드 중 복수의 방법을 공장 출하시에있어서의 다수를 제공하도록 각각 개체를 만들 수 있습니다. 다이어그램 :

 

 

 

 

다음 코드는 SendFactory 라인에 기초하여, 변형, 개조, 상기 일 :

 

[자바]보기 plaincopypublic의 클래스 SendFactory {   

   공개 발신자 produceMail () {  

 1          리턴  새로운 MailSender ();  

2 . }  

 3 .       

4.      공공 보낸 사람 produceSms () {  

 5.          반환  새로운 SmsSender ();  

6 . }  

 7}  

다음과 같이 테스트 클래스는 다음과 같습니다

[자바]보기 plaincopy

 1 공용  클래스 FactoryTest {  

 2 .   

3.      공공  정적  무효 메인 (문자열 []에 args) {  

 제 SendFactory 공장 = 새로운 SendFactory ();  

5. 발신자 발신자 = factory.produceMail ();  

6 . sender.Send ();  

7 . }  

 8}  

 

출력 :이 mailsender입니다!

(33) , 모드 정적 팩토리 메소드는 , 공장에서 모드 위의 복수의 방법이 정적 메서드로 설정하면 인스턴스를 만들 필요가 없습니다, 직접 호출 할 수 있습니다.

[자바]보기 plaincopy

 1 공용  클래스 SendFactory {  

 2 .       

3.      공공  정적 보낸 사람 produceMail () {  

 4.          반환  새로운 MailSender ();  

5 . }  

 6 .       

7.      공용  정적 발신자 produceSms () {  

 새로운 SmsSender ();  

9 . }  

 10}  

 

[자바]보기 plaincopy

 1 공용  클래스 FactoryTest {  

 2 .   

3.      공공  정적  무효 메인 (문자열 []에 args) {      

 제 발신자 발신자 = SendFactory.produceMail ();  

5 . sender.Send ();  

6 . }  

 7}

출력 :이 mailsender입니다!

전반적으로, 공장 모드에 적합 : 당신은 팩토리 메소드 패턴에 의해 생성 될 수 만들고 공통 인터페이스를 가질 필요가 제품의 다수 등장하는 사람들은. 대부분의 경우, 위의 세 가지 모드에서 첫 번째 오류에 전달 된 문자열, 당신은 개체를 올바르게 작성할 수없는 경우, 그리고 팩토리 클래스를 인스턴스화하지 않고, 두 번째와 관련하여 세 번째, 그래서 우리는 것입니다 세 번째 선택 - 정적 팩토리 메소드 패턴.

2 , 추상 팩토리 패턴 ( 요약서 공장의 )

문제가 공장 방법 패턴이 종속 팩토리 클래스의 클래스를 만들고, 그 확장 할 경우, 당신은 따라서보기의 디자인 관점에서 몇 가지 문제가있다, 폐쇄 원칙에 반하는 팩토리 클래스를 수정해야합니다, 말을하는 것입니다 어떻게 해결? 의 필요성, 새로운 기능을 추가 그것에 새로운 직접 공장 클래스를 추가, 그래서 일단 여러 공장 클래스를 생성하는 추상 팩토리 패턴을 사용하려면 필요하기 전에 코드를 수정할 수 없습니다. 추상 공장은 정말 이해하지 않기 때문에, 우리는 사진을보고하고 쉽게 코드를 이해하기.

 

 

 

 

예를 참조하십시오 :

 

[자바]보기 plaincopy

 1 공중  인터페이스 발신자 {  

 2      공개  공극 송신 ();  

삼. }

 

두 구현 클래스 :

[자바]보기 plaincopy

 1 공용  클래스 MailSender는 구현 발신자 {  

 2 . @Override  

 3.      공공  무효 보내기 () {  

 4에서 System.out.println는 ( "이 mailsender입니다!" );  

5 . }  

 6.}  

 

[자바]보기 plaincopy

 1 공용  클래스 SmsSender는 구현 발신자 {  

 2 .   

3 . @Override  

 4.      공공  무효 보내기 () {  

 5에서 System.out.println는 ( "이 SMS를 보낸 사람입니다!" );  

6 . }  

 7}

 

 인터페이스를 제공 :

 

[자바]보기 plaincopy

 1 공중  인터페이스 제공자 {  

 2      공개 발신자 생산 ();  

3 . }  

 

두 공장 카테고리 :

 

[자바]보기 plaincopy

 1. 공공  클래스 SendMailFactory는 구현 제공자 {  

 2 .       

3 . @Override  

 4.      공공 보낸 사람 농산물 () {  

 5.          반환  새로운 MailSender ();  

6 . }  

 7}  

 

[자바]보기 plaincopy

 1. 공공  클래스 SendSmsFactory는 구현 제공자 {  

 2 .   

3 . @Override  

 4.      공공 보낸 사람 농산물 () {  

 5.          반환  새로운 SmsSender ();  

6 . }  

 7}  

시험 종류 :

 

[자바]보기 plaincopy

 1 공용  클래스 테스트 {  

 2 .   

3.      공공  정적  무효 메인 (문자열 []에 args) {  

 제 공급자 제공 = 새로운 SendMailFactory ();  

5. 발신자 발신자 = provider.produce ();  

6 . sender.Send ();  

7 . }  

 8}  

공급자 인터페이스는 OK입니다 구현하는 팩토리 클래스를하는 동안, 당신은 단지, 필요 기존 변경하지 않으려면, 인터페이스 발신자를 구현하는 클래스를 달성하기 위해 필요한 정보를 적시에 전송 : 사실,이 모델의 장점은 지금 기능을 추가하려는 경우이다 코드입니다. 이 과정에서 확장 낫다!

추천

출처www.cnblogs.com/jxjy/p/11799069.html