자바 디자인 모델 의 공장 모델, 추상 공장 모델 한 편 이면 충분 하 다.

29040 단어 디자인 모드
먼저 디자인 모델 을 말 하면 디자인 모델 에는 어떤 것들 이 있 습 니까?
자바 의 디자인 모델 은 크게 세 가지 로 나 뉜 다.
  • 창설 형 모델 (5 가지): 공장 방법 모델, 추상 공장 모델, 단일 모델, 건설 자 모델, 원형 모델.
  • 구조 형 모델 (7 가지): 어댑터 모델, 장식 기 모델, 대리 모델, 외관 모델, 브리지 모델, 조합 모델, 향 원 모델.
  • 행위 형 모델 (11 가지): 전략 모델, 템 플 릿 방법 모델, 관찰자 모델, 교체 서브 모델, 책임 체인 모델, 명령 모델, 비망록 모델, 상태 모델, 방문 자 모델, 중개 자 모델, 해석 기 모델.

  • 디자인 모델 원칙
  • 1. 개폐 원칙 (Open Close Principle)
  • 개폐 원칙 은 확장 개방, 수정 폐쇄 라 는 것 이다.프로그램 이 확장 이 필요 할 때 기 존의 코드 를 수정 하여 핫 플러그 효 과 를 실현 할 수 없습니다.그래서 한 마디 로 프로그램의 확장 성 이 좋 고 유지 와 업그레이드 가 용이 하 다 는 것 이다.이러한 효 과 를 얻 으 려 면 인터페이스 와 추상 류 를 사용 해 야 한다. 뒤의 구체 적 인 디자인 에서 우 리 는 이 점 을 언급 할 것 이다.
  • 2. 리 씨 교체 원칙 (Liskov Substitution Principle)
  • 리 씨 교체 원칙 (Liskov Substitution Principle LSP) 이 대상 을 대상 으로 디자인 하 는 기본 원칙 중 하나 이다.리 씨 교체 원칙 에 따 르 면 어떤 기류 가 나타 날 수 있 는 곳 이 든 자 류 는 반드시 나타 날 수 있다.LSP 는 계승 재 활용 의 초석 으로 파생 류 가 기 류 를 교체 할 수 있 고 소프트웨어 단위 의 기능 이 영향 을 받 지 않 을 때 만 기 류 를 진정 으로 재 활용 할 수 있 으 며 파생 류 도 기 류 를 바탕 으로 새로운 행 위 를 추가 할 수 있다.리 씨 교체 원칙 은 '개 - 폐' 원칙 에 대한 보충 이다.'개 - 폐' 원칙 을 실현 하 는 관건 적 인 절 차 는 바로 추상 화 이다.한편, 기류 와 자 류 의 계승 관 계 는 추상 화의 구체 적 인 실현 이기 때문에 리 씨 의 대체 원칙 은 추상 화 를 실현 하 는 구체 적 인 절차 에 대한 규범 이다.Baidu 백과 에서
  • 3. 역전 원칙 에 의존 (Dependence Inversion Principle)
  • 이것 은 개폐 원칙 의 기초 이 고 구체 적 인 내용: 인터페이스 프로 그래 밍 은 추상 에 의존 하고 구체 에 의존 하지 않 는 다.
  • 4. 인터페이스 격 리 원칙 (인터페이스 분리 원리)
  • 이 원칙 은 여러 개의 격 리 된 인 터 페 이 스 를 사용 하 는 것 이 하나의 인 터 페 이 스 를 사용 하 는 것 보다 좋다 는 것 이다.또한 클래스 간 의 결합 도 를 낮 춘 다 는 뜻 이다. 여기 서 알 수 있 듯 이 디자인 모델 은 바로 소프트웨어 의 디자인 사상 이다. 대형 소프트웨어 구조 에서 출발 하여 업그레이드 와 유지 에 편리 하도록 한다.그래서 상기 글 에서 여러 번 등장 했다. 의존 도 를 낮 추고 결합 을 낮 춘 다.
  • 5. 디 미트 법칙 (최소 원칙 알 기) (Demeter Principle)
  • 왜 최소한 의 원칙 을 알 아야 하 는가? 즉, 하나의 실 체 는 가능 한 한 다른 실체 와 상호작용 을 적 게 하여 시스템 기능 모듈 을 상대 적 으로 독립 시 켜 야 한다.
  • 6. 합성 재 활용 원칙 (Composite Reuse Principle)
  • 상속 보 다 는 합성 / 취 합 방식 을 사용 하 는 것 이 원칙 이다.
    여러분 들 이 면접 을 볼 때 디자인 모델 같은 질문 을 많이 받 지 않 을 지 모 르 겠 어 요. 예 를 들 어 - 1. 자바 의 디자인 모델 을 아 세 요?
    그 다음 에 '알 아, 디자인 모델 은 세 가지 유형 으로 나 뉜 다. 창설 형 모델, 구조 형 모델, 행위 형 모델, 23 가지 작은 유형 으로 나 뉜 다. 그 중에서 공장 방법 모델, 추상 공장 모델, 단일 모델 이 있다. 그러나 나 는 그 중의 세 가지 만 알 고 있다. 즉, 공장 방법 모델, 추상 공장 모델, 단일 모델 에 대해 잘 알 고 있 고 다른 것 은 자신 이 없다.
    - 2.             
    

    그 다음 에 네가 말 하기 시작 했다. 그러면 내 가 먼저 공장 방법 모델 을 말 하고 공장 방법 모델 은 보통 으로 나 뉜 다. 여러 공장 의 것 은 정태 적 인 공장 방법 모델 도 있다. 사실은 그들 은 모두 공통점 이 하나 있다. 바로 여러 가지 유형 이 비슷 한 기능 을 실현 해 야 한 다 는 것 이다. 예 를 들 어 메 일 을 보 내 고 편 지 를 보 내 는 것 이다. 공장 모델 로 보면 같은 인 터 페 이 스 를 실현 하 는 것 이다.자신의 클래스 자체 에서 이 인터페이스의 각종 기능 을 실현 할 수 있 습 니 다. 사용 할 때 공장 류 를 호출 하면 됩 니 다. 구체 적 으로 어떤 대상 을 만 들 고 어떻게 만 드 는 지 상관 하지 않 아 도 됩 니 다.
    그 다음 에 추상 적 인 공장 모델 이다. 사실은 추상 적 인 공장 모델 과 일반 공장 모델 은 특히 그 가 공장 류 를 분 리 했 을 뿐이다. 모든 대상 에 공장 이 하나 있 고 다른 인 터 페 이 스 를 만 들 었 다. 이런 공장 들 은 모두 이런 인 터 페 이 스 를 실현 했다.단일 모드
     - 3.          ,           ,           ?
    

    공장 모드 는 결합 을 풀기 위해 서 입 니 다. 대상 의 생 성과 사용 과정 을 분리 합 니 다.클래스 A 가 클래스 B 를 호출 하려 면 B 를 호출 하 는 방법 일 뿐 B 의 실례 화 는 공장 류 에 맡긴다.
    공장 모델 은 코드 의 중복 을 낮 출 수 있다.B 를 만 드 는 과정 이 매우 복잡 하고 일정한 코드 양 이 필요 하 며 많은 곳 에서 사용 해 야 한다 면 중복 코드 가 많 을 것 이다.이 창설 대상 B 의 코드 를 공장 에 넣 어 통일 적 으로 관리 할 수 있다.중복 코드 를 줄 일 뿐만 아니 라 앞으로 B 에 대한 유지보수 도 편리 합 니 다.
    공장 모델 은 오 류 를 줄 일 수 있다. 공장 이 대상 의 창설 논 리 를 관 리 했 기 때문에 사용 자 는 구체 적 인 창설 과정 을 알 필요 가 없고 사용 만 하면 된다. 사용자 가 창설 논리 로 인 한 오 류 를 줄 일 수 있다.
     - 4.                  ?
    

    사실 공장 모델 의 한 역할 은 대상 을 만 드 는 것 이 고 창설 류 는 new (밑바닥 도 반 사 를 통 해 대상 을 만 드 는 것) 를 사용 할 수 있 지만 일부 상황 에서 공장 모델 을 사용 하 는 것 이 가장 적합 하 다.예 를 들 면
    상황 1: 만약 에 한 대상 이 많은 하위 클래스 를 가지 고 있다 면 이 대상 을 만 드 는 하위 클래스 는 공장 모델 을 사용 하 는 것 이 가장 적합 하 다. 인터페이스 에 대한 프로 그래 밍 뿐만 아니 라 유지 와 개발 에 편 의 를 가 져 다 줄 수 있다.
    상황 2: 대상 의 생 성 과정 / 실례 화 준비 작업 은 매우 복잡 하 다. 많은 초기 화 매개 변수 가 필요 하 다. 데이터 베 이 스 를 조회 하 는 등 평소에 개발 할 때 예 를 들 어 사용자 정의 로그 프레임 워 크, 데이터 베이스 연결 원 바 꾸 기, 사이트 의 스타일 테마 바 꾸 기 등 이다.
    공장 모드
    1 단순 공장 모델
  • 1 먼저 인 터 페 이 스 를 새로 만 듭 니 다
  • public interface SendMessageInterface {
        //       
        public void send();
    }
    
  • mail 실현
  • @Service
    public class  MailSendImpl implements SendMessageInterface {
        @Override
        public void send() {
            System.out.println("mail send");
        }
    }
    
  • phone 실현
  • @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();
    }
    
  • mail 실현
  • public class MailAbstractFactory  implements AbstractFactoryInterface{
        @Override
        public SendMessageInterface absFactoryProduce() {
            return new MailSendImpl();
        }
    }
    
  • phone 실현
  • 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. 추상 적 인 공장 모델 을 도입 한다. 즉, 매번 에 하나의 기능 을 추가 할 때마다 하나의 유형 만 추가 하여 실현 하면 된다.

    좋은 웹페이지 즐겨찾기