《안드로이드 원본 디자인 모델 해석과 실전》 독서노트-원형 모델 분석

5009 단어

소개하다.


원형 모드는 템플릿 인스턴스가 있는 작성 모드로, 이 객체에서 내부 속성이 일치하는 객체를 복사합니다.복잡하거나 구조가 소모되는 실례를 만드는 데 많이 쓰인다.이런 상황에서 이미 존재하는 실례를 복제하면 프로그램이 더욱 효율적으로 실행될 수 있기 때문이다.

정의


원형 실례로 창설 대상의 종류를 정하고 이 원형을 복사해서 새로운 대상을 만듭니다.

사용한 장면

  • 클래스 초기화는 데이터, 하드웨어 자원 등을 포함하여 매우 많은 자원을 소모하고 원형 복사를 통해 일부 소모를 피해야 한다.
  • new를 통해 대상을 만드는 데는 매우 번거로운 데이터나 접근 권한이 필요합니다.
  • 한 대상이 다른 대상에 접근해야 하고, 각 호출자가 그 값을 수정해야 할 수도 있을 때, 원형 모델로 여러 대상을 복사해서 호출자가 사용할 수 있도록 하는 것을 고려할 수 있다. 즉 보호 복사이다.

  • 단순화

     , 。 , , , 。
    
    /**
     * Created by Bowen on 2016-04-23.
     */
    public class Doc implements Cloneable {
    
        private String mText;
        private ArrayList mImages = new ArrayList<>();
    
        public Doc() {
        }
    
        public Doc(String mText, ArrayList mImages) {
            this.mText = mText;
            this.mImages = mImages;
        }
    
        public void addImage(String image){
            mImages.add(image);
        }
    
        public String getmText() {
            return mText;
        }
    
        public void setmText(String mText) {
            this.mText = mText;
        }
    
        public ArrayList getmImages() {
            return mImages;
        }
    
        public void setmImages(ArrayList mImages) {
            this.mImages = mImages;
        }
    
        public void show(){
            System.out.println("Text : "+mText);
            int size = mImages.size();
    
            for (int i = 0; i < size; i++) {
                System.out.println("Image : "+mImages.get(i));
            }
    
            System.out.println("==========================");
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
    
            Doc doc = (Doc) super.clone();
            doc.mImages = mImages;
            doc.mText = this.mText;
    
            return doc;
        }
    }
    
    

    클라이언트 사용을 살펴보겠습니다.
    /**
     * Created by Bowen on 2016-04-23.
     */
    public class Test {
        public static void main(String[] args){
            Doc originDoc = new Doc();
            originDoc.addImage("test1");
            originDoc.setmText(" 1");
            originDoc.show();
    
            try {
                Doc newDoc = (Doc) originDoc.clone();
                newDoc.setmText(" 2");
                newDoc.show();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
    
            originDoc.show();
        }
    
    }
    
    

    다음은 출력 결과입니다.
    Text :  1
    Image : test1
    ==========================
    Text :  2
    Image : test1
    ==========================
    Text :  1
    Image : test1
    ==========================
    
    

    newDoc 클론을 보고 Text 필드를 수정하여 올바르게 표시할 수 있으며,originDoc의 텍스트 내용에 영향을 주지 않습니다.

    딥 카피


    상술한 원형 모델 지식의 얕은 복사도 그림자 복사가 된다.실제로 newDoc는 원본 문서의 모든 필드를 다시 구성하는 것이 아니라originDoc의 필드를 인용합니다.A는 B를 인용하여 AB 두 대상이 같은 주소를 가리키고 A를 수정할 때 B도 변하고 B의 동일한 이치를 수정한다는 것을 설명한다.클라이언트 코드를 수정하려면 다음과 같이 하십시오.
    /**
     * Created by Bowen on 2016-04-23.
     */
    public class Test {
        public static void main(String[] args){
            Doc originDoc = new Doc();
            originDoc.addImage("test1");
            originDoc.setmText(" 1");
            originDoc.show();
    
            try {
                Doc newDoc = (Doc) originDoc.clone();
                newDoc.setmText(" 2");
                newDoc.addImage("test2");
                newDoc.show();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
    
            originDoc.show();
        }
    }
    
    

    newDoc에 옷 그림을 추가합니다.결과 표시:
    Text :  1
    Image : test1
    ==========================
    Text :  2
    Image : test1
    Image : test2
    ==========================
    Text :  1
    Image : test1
    Image : test2
    ==========================
    
    

    새 Doc에 추가된 그림이 오리진 Doc에도 나타나는 것을 볼 수 있습니다.이것은 위의 Doc에서 clone 방법 지식을 간단하게 복사했기 때문에, 인용 유형의 새로운 대상인 newDoc의 mImages는originDoc를 가리켰을 뿐이다.mImages 인용은 Images 대상을 재구성하지 않았기 때문에 new Doc에 그림을 추가할 때originDoc의 mImages와originDoc의 대상이 같기 때문에 임의의 문서를 수정하면 다른 문서도 영향을 받을 수 있습니다.
    문제는 심도 있는 복사를 하고 대상을 복제할 때 인용형 필드에 대해서도 단순한 인용 형식이 아니라 복제의 형식을 사용하여clone 방법을 수정하는 것이다.
    @Override
    protected Object clone() throws CloneNotSupportedException {
    
        Doc doc = (Doc) super.clone();
        doc.mImages = (ArrayList) this.mImages.clone();
        doc.mText = this.mText;
    
        return doc;
    }
    
    

    다시 실행하면 다음과 같은 결과가 발생합니다.
    Text :  1
    Image : test1
    ==========================
    Text :  2
    Image : test1
    Image : test2
    ==========================
    Text :  1
    Image : test1
    ==========================
    
    

    소기의 결과를 만족시키다.

    총결산


    원형 모델은 본질적으로 대상 복사이고 C++의 복사 구조 함수와 약간 유사하다.원형 모드를 사용하면
  • 복잡한 대상을 구성하는 자원 소모 문제를 해결하고 일부 장면에서 창설 대상의 효율을 높일 수 있다.
  • 보호 복사는 어떤 대상이 대외적으로 읽기만 하는 것으로 보통 한 대상의 복사를 되돌려주는 형식으로 읽기만 하는 제한을 실현할 수 있다.
  • 이점
  • 원형 모델은 메모리에서 2진법 흐름의 복사로 직접 new의 한 대상보다 성능이 훨씬 좋다. 특히 순환 체내에서 대량의 대상이 발생할 때 원시 모델은 그 장점을 더욱 잘 나타낼 수 있다.

  • 단점
  • 메모리에서 복사되며 함수를 구성할 때 실행되지 않습니다.

  • 좋은 웹페이지 즐겨찾기