設(shè)計(jì)模式-原型模式示例 每日熱聞
    2023-05-05 01:18:01 來源: 騰訊云


    (資料圖片)

    演示原型模式的實(shí)現(xiàn)方法:

    // 原型接口public interface Prototype {    Prototype clone();}// 具體的學(xué)生類,實(shí)現(xiàn)原型接口并重寫復(fù)制方法public class Student implements Prototype {    private String name;    private int age;        public Student(String name, int age) {        this.name = name;        this.age = age;    }        public String getName() {        return name;    }        public void setName(String name) {        this.name = name;    }        public int getAge() {        return age;    }        public void setAge(int age) {        this.age = age;    }        // 實(shí)現(xiàn) clone() 方法,返回一個(gè)新的學(xué)生對象并復(fù)制原有對象的屬性    @Override    public Prototype clone() {        return new Student(name, age);    }}// 客戶端代碼public class Client {    public static void main(String[] args) {        // 創(chuàng)建原型對象        Student stu1 = new Student("張三", 20);                // 克隆新對象并修改屬性        Student stu2 = (Student) stu1.clone();        stu2.setName("李四");        stu2.setAge(21);                // 打印結(jié)果        System.out.println("stu1: " + stu1.getName() + ", " + stu1.getAge());        System.out.println("stu2: " + stu2.getName() + ", " + stu2.getAge());    }}

    在這個(gè)示例代碼中,我們定義了一個(gè)原型接口 Prototype 和一個(gè)具體的學(xué)生類 Student,該類實(shí)現(xiàn)了原型接口并重寫了 clone() 方法。在客戶端代碼中,我們創(chuàng)建了一個(gè)原型對象 stu1,并通過克隆原型對象來生成一個(gè)新的學(xué)生對象 stu2,然后修改 stu2 對象的屬性并打印結(jié)果。由于 stu1 和 stu2 對象是互相獨(dú)立的,因此修改 stu2 的屬性不會影響 stu1 對象的屬性。

    需要注意的是,在實(shí)現(xiàn)原型模式時(shí),要確保克隆對象的深淺復(fù)制問題。在示例代碼中,我們只需要對基本類型的成員變量進(jìn)行復(fù)制,因此可以使用淺復(fù)制來實(shí)現(xiàn) clone() 方法。但如果 Student 類中包含了非基本類型的成員變量,例如一個(gè)引用類型的屬性 Address,那么就需要對這個(gè)屬性進(jìn)行深度克隆,否則復(fù)制出來的新對象和原有對象會共享這個(gè)引用類型的屬性,可能會引發(fā)潛在的問題。

    因此,在實(shí)現(xiàn)原型模式時(shí),需要根據(jù)具體的場景選擇適當(dāng)?shù)膹?fù)制方法來確保克隆對象的正確性。如果對象比較簡單,只包含基本類型的成員變量,可以使用淺復(fù)制來實(shí)現(xiàn) clone() 方法;如果對象比較復(fù)雜,包含了多個(gè)引用類型的成員變量,就需要使用深復(fù)制來確保新對象和原有對象的屬性是完全獨(dú)立的。

    關(guān)鍵詞:
    責(zé)任編輯: 梅長蘇