《Android源碼設(shè)計(jì)模式解析和實(shí)戰(zhàn)》原型模式

原型模式方便吧之前在對(duì)象中設(shè)置好的值直接拿過來用或者修改;

強(qiáng)拷貝 在拷貝的過程中遇到對(duì)象再進(jìn)行拷貝,不再引用被拷貝對(duì)象中的對(duì)象屬性。

淺拷貝 在拷貝過程中遇到對(duì)象直接再次引用;

對(duì)對(duì)象中的對(duì)象屬性進(jìn)行修改時(shí) 強(qiáng)拷貝不會(huì)修改 拷貝對(duì)象的屬性;淺拷貝則會(huì);

<pre>
ArrayList<Integer> numberList = new ArrayList<>();
numberList.add(1);
numberList.add(2);
Teacher teacher_1 = new Teacher(person_3);

    teacher_1.setNumberList(numberList);
    Teacher teacher_2 = (Teacher) teacher_1.clone();
    numberList.add(3);

</pre>
當(dāng) Teacher.clone()中為強(qiáng)飲用時(shí) teacher_1會(huì)改變 teacher_2 不會(huì)
當(dāng) Teacher.clone()中為淺飲用時(shí) teacher_1會(huì)改變 teacher_2 也會(huì)
實(shí)體類:
<pre>
public class Person implements Cloneable {
private String name;
private int age;

public Person(String name, int age) {
    this.name = name;
    this.age = age;
}

@Override
protected Object clone() {
    Person person = null;
    try {
        person = (Person) super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return person;
}

public Person() {
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getName() {
    return name;
}

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

@Override
public String toString() {
    final StringBuilder sb = new StringBuilder("Person{");
    sb.append("name='").append(name).append('\'');
    sb.append(", age=").append(age);
    sb.append('}');
    return sb.toString();
}

}

public class Student extends Person {
private int number;

public Student(int number) {
    this.number = number;
}

public Student(Person person) {
    setName(person.getName());
    setAge(person.getAge());
}

@Override
public String toString() {
    final StringBuilder sb = new StringBuilder("Student{");
    sb.append("number=").append(number);
    sb.append('}');
    return sb.toString();
}

public int getNumber() {
    return number;
}

public void setNumber(int number) {
    this.number = number;
}

@Override
protected Object clone() {
    Student student = null;
    student = (Student) super.clone();
    student.number = number;
    return student;
}

}

public class Teacher extends Person {
private ArrayList<Integer> numberList;

public Teacher() {
}

@Override
public String toString() {
    final StringBuilder sb = new StringBuilder("Teacher{");
    sb.append("numberList=").append(numberList);
    sb.append('}');
    return sb.toString();
}

public Teacher(Person person) {
    setName(person.getName());
    setAge(person.getAge());
}
public ArrayList<Integer> getNumberList() {
    return numberList;
}

public void setNumberList(ArrayList<Integer> numberList) {
    this.numberList = numberList;
}

@Override
protected Object clone() {
    Teacher teacher  = (Teacher) super.clone();

// teacher.numberList = (ArrayList<Integer>) numberList.clone();
teacher.numberList =numberList;
return teacher;
}
}

public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ArrayList<Person> personArrayList = new ArrayList<>();
    Person person_1 = new Person("張三", 10);
    Person person_2 = new Person("李斯", 10);
    Person person_3 = new Person("張老師", 10);
    Student student_1 = new Student(person_1);
    student_1.setNumber(1);
    personArrayList.add(student_1);
    Student student_2 = new Student(person_2);
    student_2.setNumber(2);
    personArrayList.add(student_2);
    ArrayList<Integer> numberList = new ArrayList<>();
    numberList.add(student_1.getNumber());
    numberList.add(student_2.getNumber());

    Teacher teacher_1 = new Teacher(person_3);
    teacher_1.setNumberList(numberList);
    personArrayList.add(teacher_1);
    Teacher teacher_2 = (Teacher) teacher_1.clone();
    numberList.add(3);
    personArrayList.add(teacher_1);
    personArrayList.add(teacher_2);
    
    for (Person person : personArrayList) {
        Log.i(TAG, "onCreate: " + person.toString());
    }
}

}

teacher.numberList = (ArrayList<Integer>) numberList.clone(); //強(qiáng)拷貝
03-01 20:39:08.798 15321-15321/com.lerz.clonedemo I/MainActivity: onCreate: Student{number=1}
03-01 20:39:08.798 15321-15321/com.lerz.clonedemo I/MainActivity: onCreate: Student{number=2}
03-01 20:39:08.798 15321-15321/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2, 3]}
03-01 20:39:08.798 15321-15321/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2, 3]}
03-01 20:39:08.798 15321-15321/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2]}

teacher.numberList =numberList;//淺拷貝
03-01 20:34:23.558 13827-13827/com.lerz.clonedemo I/MainActivity: onCreate: Student{number=1}
03-01 20:34:23.558 13827-13827/com.lerz.clonedemo I/MainActivity: onCreate: Student{number=2}
03-01 20:34:23.558 13827-13827/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2, 3]}
03-01 20:34:23.558 13827-13827/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2, 3]}
03-01 20:34:23.558 13827-13827/com.lerz.clonedemo I/MainActivity: onCreate: Teacher{numberList=[1, 2, 3]}

</pre>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容