프로토타입(Prototype) 모드 - Java 디자인 모드(5)

18878 단어 Java 디자인 모드

원형 모드 소개


프로토타입 모드(Prototype Pattern): 성능을 보장하면서 중복된 객체를 작성하는 데 사용됩니다.분류: 작성 모드.
이 모델은 현재 대상의 복제를 만드는 데 사용되는 원형 인터페이스를 실현했다.직접 대상을 만드는 대가가 비교적 클 때 이런 모델을 채택한다.예를 들어 하나의 대상은 높은 대가의 데이터베이스 조작 후에 만들어져야 한다.우리는 이 대상을 캐시해서 다음 요청에 복제를 되돌려주고 필요할 때 데이터베이스를 업데이트해서 데이터베이스 호출을 줄일 수 있다.
의도: 원형 실례로 창설 대상의 종류를 지정하고 이 원형을 복사해서 새로운 대상을 만듭니다.주요 해결: 운행 기간에 원형을 구축하고 삭제합니다.

역할 구조


추상 원형 클래스(Prototype): 클론 자체의 인터페이스를 선언합니다.특정 프로토타입 클래스(ConcretePrototype): 클론의 특정 작업을 수행합니다.클라이언트 클래스(Client): 원형을 복제하여 새로운 대상을 얻습니다.

구체적 실현


이미 있는 이력서를 통해 새로운 이력서를 복사하다.
단계1: 추상적 원형류를 실현한 구체적인 원형류를 제시한다.
/**
 * CurriculumVitae( ), —— 。
 * Cloneable—— , 。
 * @author Administrator
 *
 */
public class CurriculumVitae implements Cloneable {
    private String name;
    private String personalInfo;
    private String ability;
    private String other;

    public CurriculumVitae(String name, String info, String ability, String other) {
        this.name = name;
        this.personalInfo = info;
        this.ability = ability;
        this.other = other;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPersonalInfo() {
        return personalInfo;
    }

    public void setPersonalInfo(String personalInfo) {
        this.personalInfo = personalInfo;
    }

    public String getAbility() {
        return ability;
    }

    public void setAbility(String ability) {
        this.ability = ability;
    }

    public String getOther() {
        return other;
    }

    public void setOther(String other) {
        this.other = other;
    }

    @Override
    public Object clone() {
        CurriculumVitae cv = null;
        try {
            cv = (CurriculumVitae) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        return cv;
    }

    @Override
    public String toString() {
        return this.name + ":" + this.personalInfo + " [" + this.ability + "]" + " " + this.other;
    }

    public void show() {
        System.out.println(this);
    }
}
2단계: Client 클래스를 지정합니다.즉, 테스트 클래스입니다.
public class Client {
    public static void main(String[] args) {
        System.out.println(" ");
        CurriculumVitae cv = new CurriculumVitae(" ", " -20-182********", " Java", " ");
        cv.show();

        System.out.println(" ");
        CurriculumVitae cvCopy = (CurriculumVitae) cv.clone();
        cvCopy.show();
    }
}
3단계: 결과를 검증합니다.
 
 : -20-182******** [ Java]  
 
 : -20-182******** [ Java]  

총결산


사용 시기:
  • 시스템이 제품의 생성, 구성, 표현에 독립해야 할 때.
  • 실례화할 클래스가 실행 시간에 지정될 때, 예를 들어 동적 마운트를 통해.
  • 제품 클래스와 평행하는 공장 클래스를 만들 때를 피하기 위해.
  • 한 종류의 실례가 몇 개의 다른 상태 조합 중 하나만 있을 때 상응하는 수량의 원형을 구축하고 복제하는 것이 매번 적당한 상태로 수동으로 이 종류를 실례화하는 것보다 더 편리할 수 있다.
  • 어떻게 해결: 기존의 원형 대상을 이용하여 원형 대상과 같은 실례를 신속하게 생성한다.키 코드:
  • 복제 작업을 실현하고 JAVA에서 Cloneable를 계승하고 clone()을 다시 씁니다.NET에서는 Object 클래스의 MemberwiseClone () 방법을 사용하여 대상의 얕은 복사를 실현하거나 서열화된 방식으로 깊은 복사를 실현할 수 있습니다.
  • 원형 모델은 격리류 대상의 사용자와 구체적인 유형(이변류) 간의 결합 관계에 사용되는데 이'이변류'들이 안정적인 인터페이스를 가지도록 요구한다.
  • 응용 실례: 1. 세포 분열.2. JAVA의 Object clone() 방법입니다.
    이점:
  • 성능 향상
  • 구조 함수의 제약을 피한다.
  • 단점:
  • 복제 방법을 갖추려면 클래스의 기능을 전반적으로 고려해야 한다. 이것은 새로운 클래스에 어렵지 않지만 기존의 클래스에 대해 반드시 쉽지 않다. 특히 하나의 클래스가 직렬화된 간접 대상을 지원하지 않거나 순환 구조를 포함할 때 인용한다.
  • Cloneable 인터페이스를 사용해야 합니다.
  • 장면 사용:
  • 자원 최적화 장면.
  • 류의 초기화는 매우 많은 자원을 소화해야 하는데 이 자원은 데이터, 하드웨어 자원 등을 포함한다.
  • 성능과 안전이 요구되는 장면.
  • new를 통해 대상을 만드는 데 매우 번거로운 데이터 준비나 접근 권한이 필요하면 원형 모드를 사용할 수 있습니다.
  • 한 객체에 여러 수정자가 있는 장면입니다.
  • 한 대상이 다른 대상에게 접근해야 하고 각 호출자가 그 값을 수정해야 할 때 원형 모드로 여러 개의 대상을 복사해서 호출자가 사용하도록 고려할 수 있다.
  • 실제 프로젝트에서 원형 모델은 단독으로 나타나지 않고 공장 방법 모델과 함께 나타나며 clone 방법을 통해 대상을 만들고 공장 방법으로 호출자에게 제공한다.원형 모드는 자바와 혼연일체가 되어 누구나 쉽게 사용할 수 있습니다.
  • 주의사항: 하나의 클래스를 실례화하여 새로운 대상을 구성하는 것과 달리 원형 모델은 기존의 대상을 복사하여 새로운 대상을 생성하는 것이다.얕은 복사: Cloneable을 실현하고 다시 쓰기;딥 카피: Serializable를 통해 바이너리 흐름을 읽습니다.

    보충(딥 클론 및 얕은 클론)


    깊이 클론 및 얕은 클론 정보.간단히 말하면:
  • 얕은 복제: 원 대상의 인용 유형을 복제하지 않고 인용 유형의 지향만 복제한다.
  • 딥 클론: 모두 복제.
  • 다음 예제에 참조 유형을 추가하여 코드로 예를 들어 설명합니다.
    // :
    /**
     * CurriculumVitae( ), —— 。
     * Cloneable—— , 。
     * @author Administrator
     *
     */
    public class CurriculumVitae implements Cloneable {
        private String name;
        private String personalInfo;
        private String ability;
        private String other;
        private Birthday birthday;
    
        public CurriculumVitae(String name, String info, String ability, String other, Birthday birthday) {
            this.name = name;
            this.personalInfo = info;
            this.ability = ability;
            this.other = other;
            this.birthday = birthday;
        }
    
        public Birthday getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Birthday birthday) {
            this.birthday = birthday;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPersonalInfo() {
            return personalInfo;
        }
    
        public void setPersonalInfo(String personalInfo) {
            this.personalInfo = personalInfo;
        }
    
        public String getAbility() {
            return ability;
        }
    
        public void setAbility(String ability) {
            this.ability = ability;
        }
    
        public String getOther() {
            return other;
        }
    
        public void setOther(String other) {
            this.other = other;
        }
    
        @Override
        public Object clone() {
            CurriculumVitae cv = null;
            try {
                cv = (CurriculumVitae) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
    
            return cv;
        }
    
        @Override
        public String toString() {
            return this.name + "(" + this.birthday + "):" + this.personalInfo 
                    + " [" + this.ability + "]" + " " + this.other;
        }
    
        public void show() {
            System.out.println(this);
        }
    }
    
    /**
     * Birthday 
     * @author Administrator
     *
     */
    public class Birthday {
        private String year;
        private String month;
        private String day;
    
        public Birthday(String year, String month, String day) {
            this.year = year;
            this.month = month;
            this.day = day;
        }
    
        public String getYear() {
            return year;
        }
    
        public void setYear(String year) {
            this.year = year;
        }
    
        public String getMonth() {
            return month;
        }
    
        public void setMonth(String month) {
            this.month = month;
        }
    
        public String getDay() {
            return day;
        }
    
        public void setDay(String day) {
            this.day = day;
        }
    
        @Override
        public String toString() {
            return this.year + "-" + this.month + "-" + this.day;
        }
    }
    
    /**
     *  
     * @author Administrator
     *
     */
    public class Client {
        public static void main(String[] args) {
            System.out.print(" :");
            CurriculumVitae cv = new CurriculumVitae(" ", " -20-182********", " Java", " ", 
                    new Birthday("1996", "01", "01"));
            cv.show();
    
            System.out.print(" :");
            CurriculumVitae cvCopy = (CurriculumVitae) cv.clone();
            cvCopy.getBirthday().setYear("2000");
            cvCopy.show();
    
            System.out.print(" :");
            cv.show();
        }
    }
    
    // 
     : (1996-01-01): -20-182******** [ Java]  
     : (2000-01-01): -20-182******** [ Java]  
     : (2000-01-01): -20-182******** [ Java]  
    
    복제된 복사본을 수정한 후 복제본을 수정한 후 원본이 바뀌었다는 것을 알 수 있다. 복제할 때birthday의 인용만 복제하고 복제하지 않았기 때문에 복제본을 수정하면 원본에 영향을 미칠 수 있다는 뜻이다. 이것은 간단한 복제이다.원형 모델은 심복제다.어떻게 심층 클론을 실현합니까?
  • 인용 유형의 클래스에서도 클론을 실현한다. 즉, 복제할 때 복제한다.
  • 서열화를 실현하고 대상을 흐름에 쓰면 대상의 내용이 바이트 흐름이 되고 인용도 존재하지 않는다.그리고 바이트 흐름을 읽고 반서열화하면 완전한 복사 작업이 완료됩니다.
  • // 
    // 
        /**
         *  CurriculumVitae 
         *  
         */
        @Override
        public Object clone() {
            CurriculumVitae cv = null;
            try {
                cv = (CurriculumVitae) super.clone();
                cv.birthday = (Birthday) birthday.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
    
            return cv;
        }
    
        /*
         *  Birthday 。 Cloneable , public class Birthday implements Cloneable 
         *  clone 。
         */
        @Override
        public Object clone() {
            Birthday birthday = null;
            try {
                birthday = (Birthday) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
    
            return birthday;
        }
    
    // 
     : (1996-01-01): -20-182******** [ Java]  
     : (2000-01-01): -20-182******** [ Java]  
     : (1996-01-01): -20-182******** [ Java]  
    사본의 수정이 원본에 영향을 주지 않고 목적을 달성했다는 것을 알 수 있다.

    좋은 웹페이지 즐겨찾기