設(shè)計(jì)模式[4]-原型模式-Prototype Pattern

1. 原型模式簡(jiǎn)介

原型模式(Prototype Pattern)是創(chuàng)建型設(shè)計(jì)模式,根據(jù)一個(gè)原型對(duì)象,通過(guò)Clone的方式,創(chuàng)建出一個(gè)新的對(duì)象。

Java的原型模式特別簡(jiǎn)單,一個(gè)類(lèi)只需要實(shí)現(xiàn)Cloneable接口,并且重寫(xiě)(Override)Object類(lèi)中clone方法。

2. 原型模式舉例

原型類(lèi) Person

/**
 * 在java虛擬機(jī)中,只有實(shí)現(xiàn)Cloneable接口的類(lèi)才可以被拷貝,
 * 否則在運(yùn)行時(shí)會(huì)拋出CloneNotSupportedException異常。
 */
public class Person implements Cloneable{

    private int age;

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
    // 淺拷貝
    @Override
    public Person clone(){
        Person person = null;
        try {
            person = (Person)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return person;
    }
}

客戶端類(lèi)

public class PrototypeMain {

    public static void main(String[] args) {
        Person person = new Person("張三", 18);
        // 克隆過(guò)后,可以修改克隆的對(duì)象,變成你想要的對(duì)象
        Person copy = person.clone();
        // person 和 copy 這2個(gè)對(duì)象的內(nèi)存地址不相等。
        System.out.println(person == copy);
    }
}

3. 關(guān)于Clone

Java的世界里,創(chuàng)建對(duì)象的方式包括:使用new操作符、反序列化、通過(guò)反射的newInstance方法和Clone方式。

關(guān)于Clone,需要注意的是,Clone方式創(chuàng)建實(shí)例對(duì)象,不會(huì)調(diào)用類(lèi)的構(gòu)造器,不論構(gòu)造器的訪問(wèn)權(quán)限是public還是private,因此,如果單例模式類(lèi)沒(méi)有通過(guò)手段防備,其對(duì)象也可能被clone出來(lái)。

Clone要注意深拷貝和淺拷貝的問(wèn)題。Object類(lèi)的clone方法只會(huì)拷貝對(duì)象中8種基本數(shù)據(jù)類(lèi)型和它們的封裝類(lèi),對(duì)于其它類(lèi)型(對(duì)于數(shù)組、容器對(duì)象、引用對(duì)象)的對(duì)象,只會(huì)拷貝其引用,是為淺拷貝。例如Person類(lèi)里有一個(gè)Phone類(lèi)的屬性,現(xiàn)在有個(gè)Person對(duì)象A,拷貝出對(duì)象B,B中的Phone和A中的Phone是同一個(gè),修改了其中一個(gè),就會(huì)影響另一個(gè)。如果要實(shí)現(xiàn)深拷貝,就需要在clone方法里自己實(shí)現(xiàn)深拷貝。

@Override
public Person clone(){
    Person person = null;
    try {
        person = (Person)super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    // 深拷貝
    person.phone = (Phone)phone.clone();
    return person;
}

4. 原型模式總結(jié)

Clone的方式創(chuàng)建對(duì)象,比通過(guò)new創(chuàng)建對(duì)象的效率要高;因此原型模式適合創(chuàng)建對(duì)象成本較高的場(chǎng)景。

原型模式需要為類(lèi)編寫(xiě)clone方法,尤其是在深拷貝的場(chǎng)景,需要層層實(shí)現(xiàn)深拷貝。

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容