1. 개요
전반적으로 설계 패턴은 세 가지 범주로 나뉩니다.
(1) 크리에이티브 모드 , 총 5 가지 유형 : 공장 방법 모드, 추상 공장 모드, 싱글 톤 모드, 빌더 모드 및 프로토 타입 모드.
(2) 구조 모드 , 총 7 가지 유형 : 어댑터 모드, 데코레이터 모드, 프록시 모드, 모양 모드, 브리지 모드, 조합 모드 및 즐거움 모드.
(3) 행동 모드 , 총 11 개의 : 정책 모드, 템플릿 메소드 모드, 관찰 모드, 반복 하위 모드, 책임 체인 모드, 명령 모드, 메모 모드, 상태 모드, 방문자 모드, 중개 모드 및 통역 모드.
2. 디자인 모델의 6 가지 원칙
1. 가까운 원리를 열어줍니다
개방 및 폐쇄의 원리는 확장 및 수정에 가깝게 개방하는 것입니다. 프로그램을 확장 해야하는 경우 원래 코드를 수정하여 핫 플러그 효과를 얻을 수 없습니다.
2. Liskov 대체 원리
공식 설명은 비교적 추상적이며 바이두에 사용될 수 있습니다. 실제로, 그것은 다음과 같이 이해 될 수있다 : (1) 서브 클래스의 능력은 부모 클래스, 즉 부모 클래스가 사용할 수있는 방법, 서브 클래스가 사용할 수있는 방법보다 크거나 동일해야합니다. (2) 반환 값에 대해서도 마찬가지입니다. 상위 클래스 메소드가 목록을 반환하고 서브 클래스가 배열 목록을 반환한다고 가정 해 봅시다. 상위 클래스 메소드가 Arraylist를 반환하고 Child Class가 목록을 반환하면 의미가 없습니다. 여기서 값을 반환하는 서브 클래스의 능력은 상위 클래스보다 작습니다. (3) 예외가 발생하는 경우도있다. 모든 서브 클래스 메소드는 부모 클래스 방법을 던지는 서브 클래스를 선언하여 예외를 선언 할 수 있습니다.
부모 클래스가 선언하지 않았다는 예외가 발생했다고 선언 할 수는 없습니다.
3. 의존성 반전 원리
이것은 개방 및 마감의 원리의 기초이며, 특정 내용 : 인터페이스 지향 프로그래밍, 콘크리트보다는 추상화에 의존합니다.
4. 인터페이스 분리 원리
이 원칙은 다음을 의미합니다. 여러 분리 된 인터페이스를 사용하는 것이 단일 인터페이스를 사용하는 것보다 낫습니다. 또한 클래스 사이의 커플 링 정도를 줄이는 것을 의미합니다. 여기에서 설계 패턴은 실제로 업그레이드 및 유지 관리의 편의를 위해 대형 소프트웨어 아키텍처에서 시작하여 소프트웨어의 디자인 아이디어임을 알 수 있습니다. 따라서 위의 기사는 여러 번 나타났습니다. 의존성을 줄이고 커플 링을 줄입니다.
5. Demeter 원리
지식이 가장 적은 이유는 무엇입니까? 즉, 한 엔티티는 시스템 기능 모듈이 비교적 독립적이되도록 가능한 한 적은 다른 엔터티와 상호 작용해야합니다.
6. 복합 재사용 원리
원칙은 상속이 아닌 합성/응집 방법을 사용하는 것입니다.
3. 창조 모드
공장 방법 모드, 추상 공장 모드, 싱글 톤 모드, 빌더 모드 및 프로토 타입 모드의 5 가지 유형의 생성 모드가 있습니다.
3.1. 공장 방법 모델
공장 방법 모드는 일반 공장 모드, 다중 공장 방법 모드 및 정적 공장 방법 모드의 세 가지 유형으로 나뉩니다.
3.1.1. 일반 공장 모델
일반 공장 모델은 공장 수업을 설정하고 동일한 인터페이스를 구현하는 일부 클래스의 인스턴스를 만드는 것입니다.
package com.mode.create; public interface myinterface {public void print ();} package com.mode.create; 공개 클래스 MyClassone은 myinterface {@override public void print () {System.out.println ( "myclassone"); }} package com.mode.create; Public Class MyClasstwo는 myinterface {@override public void print () {System.out.println ( "myclasstwo"); }} package com.mode.create; public class myFactory {public myinterface produce (문자열 유형) {if ( "one".equals (type)) {return new myclassone (); } else if ( "two".Equals (type)) {return new MyClasstwo (); } else {System.out.println ( "찾을 수없는 유형 없음"); 널 리턴; }}} package com.mode.create; Public Class FactoryTest {public static void main (String [] args) {myFactory factory = new MyFactory (); myinterface myi = factory.proctor ( "one"); myi.print (); }}공동 테스트 결과는 분명해야한다고 생각합니다.
이 문장을 다시 이해해 보겠습니다. 일반 공장 모델은 공장 수업을 설정하고 동일한 인터페이스를 구현하는 일부 클래스의 인스턴스를 만드는 것입니다.
3.1.2. 여러 공장 방법 모드
여러 공장 방법 모드는 일반 공장 방법 모드를 개선합니다. 여러 공장 방법 모드는 개체를 개별적으로 생성하기위한 여러 공장 방법을 제공하는 것입니다.
코드를 직접 살펴 보겠습니다. MyFactory 및 FactoryTest를 다음과 같이 수정합니다.
package com.mode.create; 공개 클래스 myFactory {public myinterface produceOne () {return new MyClassone (); } public myinterface producetwo () {return new myclasstwo (); }} package com.mode.create; Public Class FactoryTest {public static void main (String [] args) {myFactory factory = new MyFactory (); myinterface myi = factory.proctoryone (); myi.print (); }}작동 결과도 매우 분명합니다.
이 문장을 다시 이해해 보겠습니다. 여러 공장 방법 모드는 일반 공장 방법 모드를 개선합니다. 여러 공장 방법 모드는 개체를 개별적으로 생성하기위한 여러 공장 방법을 제공하는 것입니다.
3.1.3. 정적 공장 방법 모드
정적 팩토리 메서드 모드, 위의 여러 공장 메소드 모드의 메소드를 정적으로 설정하고 인스턴스를 만들 필요가 없으며 직접 호출 할 필요가 없습니다.
코드를 직접 살펴 보겠습니다. MyFactory 및 FactoryTest를 다음과 같이 수정합니다.
package com.mode.create; 공개 클래스 myFactory {public static myinterface produceOne () {return new myclassone (); } public static myinterface producetwo () {return new myclasstwo (); }} package com.mode.create; Public Class FactoryTest {public static void main (String [] args) {myinterface myi = myFactory.ProcuctOne (); myi.print (); }}작업 결과는 여전히 매우 분명합니다.
다시 검토 : 정적 공장 메소드 모드, 위의 여러 공장 메소드 모드의 메소드를 정적으로 설정하면 인스턴스를 만들 필요가 없으며 직접 호출 할 필요가 없습니다.
3.2. 추상 공장 패턴
공장 메소드 모델에는 클래스 제작이 공장 수업에 의존하는 데 문제가 있습니다. 즉 프로그램을 확장하려면 폐쇄 원칙을 위반하는 공장 클래스를 수정해야합니다.
이 문제를 해결하려면 추상 공장 패턴을 살펴 보겠습니다. 여러 공장 클래스를 만들어 새로운 기능이 필요한 후에는 이전 코드를 수정하지 않고 새 공장 클래스를 직접 추가 할 수 있습니다.
이것은 폐쇄 원리를 준수합니다.
아래 코드를 살펴 보겠습니다.
MyInterface, MyClassone, MyClasstwo는 변경되지 않았습니다.
다음 인터페이스 및 클래스가 추가됩니다.
package com.mode.create; 공개 인터페이스 제공자 {public myinterface product (); } package com.mode.create; 공개 클래스 MyFactoryOne은 제공자 {@override public myinterface product () {return new myclassone (); }} 패키지 com.mode.create; 공개 클래스 MyFactoryTwo는 제공자를 구현합니다. }}다음과 같이 테스트 클래스 팩토리 테스트를 수정하십시오.
package com.mode.create; Public Class FactoryTest {public static void main (String [] args) {제공자 제공자 = new MyFactoryOne (); MyInterface myi = provider.proctord (); myi.print (); }}작동 결과는 여전히 분명합니다.
다시 검토 : 추상 공장 패턴은 여러 공장 클래스를 만드는 것이므로 새로운 기능이 필요하면 이전 코드를 수정하지 않고 새로운 공장 클래스를 직접 추가 할 수 있습니다.
3.3. 싱글 톤 모드
싱글 톤 패턴, 너무 많은 설명이 필요하지 않습니다.
코드를보십시오.
패키지 테스트; 공개 클래스 myObject {private static myObject myObject; private myObject () {} public static myObject getInstance () {if (myObject! = null) {} else {myObject = new myObject (); } return myObject; }}그러나 이로 인해 다중 스레딩 문제가 발생합니다. 자세한 설명은 "Java 멀티 스레딩 프로그래밍의 핵심 기술"책에서 6 장을 볼 수 있습니다.
3.4. 빌더 모드
빌더 패턴 : 동일한 시공 프로세스가 다른 표현을 생성 할 수 있도록 복잡한 물체의 구성을 표현과 분리하는 것입니다.
문자 그대로 매우 추상적으로 보이지만 실제로는 매우 추상적입니다! ! ! !
빌더 모드에는 일반적으로 다음 문자가 포함됩니다.
(1) 빌더 : 제품 객체의 다양한 구성 요소의 구성을 표준화하기위한 추상 인터페이스를 제공합니다. 이 인터페이스는 복잡한 객체의 어떤 부분이 생성되는지를 지정하며 특정 객체 구성 요소의 생성을 포함하지 않습니다.
(2) ConcreteBuilder : Builder 인터페이스를 구현하고 다른 비즈니스 논리를 위해 복잡한 객체의 다양한 부분 생성을 정의합니다. 시공 공정이 완료된 후 제품의 예가 제공됩니다.
(3) 감독 : 특정 빌더에게 전화하여 복잡한 물체의 다양한 부분을 만듭니다. 강사는 특정 제품 정보를 포함하지 않지만 객체의 모든 부분이 손상되지 않거나 특정 순서로 생성되도록하는 책임 만 있습니다.
(4) 제품 : 생성 될 복잡한 물체.
게임 개발에서 악당을 구축하는 것이 일반적이며, 요구 사항은 다음과 같습니다. 악당에는 머리, 몸 및 발을 포함해야합니다.
다음 코드를 살펴 보겠습니다.
제품 (생성 할 복잡한 개체) : :
package com.mode.create; 공개 클래스 사람 {개인 문자열 헤드; 개인 문자열 본체; 개인 문자열 발; 공개 문자열 gethead () {return head; } public void sethead (String Head) {this.head = 헤드; } public String getBody () {return body; } public void setbody (String body) {this.body = body; } public String getfoot () {return foot; } public void setfoot (문자열 발) {this.foot = 풋; }} Builder (제품 객체의 다양한 구성 요소의 구성을 표준화하기위한 추상 인터페이스를 제공합니다.이 인터페이스는 구현되도록 생성 된 복잡한 객체의 어떤 부분을 지정하고, 특정 객체 구성 요소의 생성을 포함하지 않습니다.) :
package com.mode.create; 공개 인터페이스 인원 builder {void buildhead (); void buildbody (); void buildfoot (); 사람 BuildPerson ();} ConcreteBuilder (다른 비즈니스 로직을 위해 복잡한 객체의 다양한 부분의 생성을 구현하는 Builder 인터페이스를 구현합니다. 구성 프로세스가 완료된 후 제품의 예를 제공하십시오.)
package com.mode.create; 공공 계급 맨 빌더는 개인의 구현을 구현합니다. public manbuilder () {person = new person (); } public void buildbody () {person.setbody ( "사람의 몸을 만들기"); } public void buildfoot () {person.setfoot ( "남자의 발을 빌드"); } public void buildhead () {person.sethead ( "남자의 머리 빌드"); } 공공 인물 BuildPerson () {반환 인; }} 감독 (복잡한 물체의 다양한 부분을 만들려면 특정 빌더에게 전화하십시오. 강사는 특정 제품 정보를 포함하지 않습니다. 객체의 일부가 손상되지 않거나 특정 순서로 생성되는지 확인하는 것은 담당합니다.) : :
package com.mode.create; 공개 클래스 persondirector {공공 인물 ConstructPerson (PersonBuilder PB) {pb.buildhead (); pb.buildbody (); pb.buildfoot (); 반환 pb.buildperson (); }} 테스트 클래스 :
package com.mode.create; 공개 클래스 테스트 {public static void main (String [] args) {persondirector pd = new persondirector (); Person = Pd.constructPerson (New Manbuilder ()); System.out.println (person.getbody ()); System.out.println (person.getfoot ()); System.out.println (person.gethead ()); }}실행 결과 :
검토 : 빌더 패턴 : 동일한 시공 프로세스가 다른 표현을 생성 할 수 있도록 복잡한 물체의 구성을 표현에서 구분하는 것입니다.
3.5. 프로토 타입 모드
이 패턴의 아이디어는 객체를 프로토 타입으로 사용하고 복사하고 복제하고 원래 객체와 유사한 새로운 객체를 생성하는 것입니다.
물건을 복사하는 것에 대해 말하면, 나는 얕은 복사 및 물체의 깊은 복사와 함께 그것에 대해 이야기 할 것입니다. 우선, 당신은 물체의 깊고 얕은 복사의 개념을 이해해야합니다.
얕은 사본 : 객체를 복사 한 후 기본 데이터 유형의 변수가 재현되고 참조 유형은 원래 객체를 가리 킵니다.
딥 카피 : 객체를 복사 한 후 기본 데이터 유형과 참조 유형이 모두 재현됩니다. 간단히 말해서, 깊은 복사는 완전히 복사되며 얕은 복사는 철저하지 않습니다.
깊이 복사의 예를 작성하십시오.
package com.mode.create; import java.io.bytearrayinputStream; import java.io.bytearrayoutputStream; import java.io.ioexception; import java.io.objectinputStream; import java.io.objectOutputStream; import java.io.serializable; 공개 클래스 프로토 타입은 클로닝 가능, 직렬화 가능 {개인 정적 최종 긴 SerialversionUID = 1L; 개인 INT 기지; 개인 정수 OBJ; /* 얕은 사본*/ public object clone ()는 clonenotsupportedException을 던지려고 {// 클로닝 가능한 인터페이스가 빈 인터페이스이기 때문에 클로아 나 클론과 같은 will에서 구현 클래스의 메소드 이름을 정의 할 수 있습니다. proto = (프로토 타입) super.clone (); 리턴 프로토; } /* 딥 카피* / public Object DeepClone ()는 ioException, classNotFoundException { /* 이진 스트림을 현재 객체에 쓰기* / bytearRayoutputStream bos = new BytearRayoutputStream (); ObjectOutputStream OOS = 새로운 ObjectOutputStream (BOS); oos.writeobject (this); /* 바이너리 스트림에 의해 생성 된 새 개체를 읽습니다*/ bytearrayinputStream bis = 새로운 BytearRayinputStream (bos.tobytearray ()); ObjectInputStream OIS = New ObjectInputStream (BIS); return ois.readobject (); } public int getBase () {return base; } public void setbase (int base) {this.base = base; } public Integer getObj () {return obj; } public void setobj (정수 obj) {this.obj = obj; }} 테스트 클래스 :
package com.mode.create; import java.io.ioexception; 공개 클래스 테스트 {public static void main (String [] args)은 clonenotsupportedException, classNotFoundException, ioException {프로토 타입 프로토 타입 = 새로운 프로토 타입 (); 프로토 타입. 세트베이스 (1); 프로토 타입 .setobj (새 정수 (2)); /* 얕은 사본*/ 프로토 타입 프로토 타입 1 = (프로토 타입) 프로토 타입 .Clone (); /* 딥 카피*/ 프로토 타입 프로토 타입 = (프로토 타입) 프로토 타입 .deepclone (); System.out.println (프로토 타입 1.getObj () == 프로토 타입 1.getObj ()); System.out.println (프로토 타입 1.getObj () == prototype2.getObj ()); }}실행 결과 :
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람의 학습에 도움이되기를 바랍니다.