設計模式(六)原型模式

2021-08-30 11:41:28 字數 2697 閱讀 3989

原型模式:用原型例項建立指定物件的種類,並且通過拷貝這些原型建立新的物件

要實現建立原型,需要實現cloneable介面,重寫clone()方法

(基本的原型模式,物件的屬性沒有引用型別)

public class prototype implements cloneable 

public string getname()

public void setname(string name)

public int getage()

public void setage(int age)

@override

public string tostring() ';

}@override

protected object clone() throws clonenotsupportedexception

}public class concreteprototype extends prototype

@override

protected object clone() throws clonenotsupportedexception

}public class client

}

當物件的屬性中有乙個是引用型別的時候,clone的是淺複製,

我在寫這個淺複製的demo的時候,剛才是所得的結果一直是深複製的,很納悶,最後才發現是自己客戶端的程式寫的有問題,work,new了三次,用new建立的必然會指向不同的位址。所以結果與深複製的結果相同

public class prototype implements cloneable 

public string getname()

public void setname(string name)

public int getage()

public void setage(int age)

@override

public string tostring() ';

}public work getwork()

public void setwork(string company,int salary)

@override

protected prototype clone() throws clonenotsupportedexception

}public class work

public int getsalary()

public void setsalary(int salary)

public string getcompany()

public void setcompany(string company)

@override

public string tostring() ';

}}public class main

}

執行結果如下:

prototype}

prototype}

prototype}

深複製的例子:

public class prototype implements cloneable

public prototype(string name, int age, work work)

public void setwork(work work)

public string getname()

public void setname(string name)

public int getage()

public void setage(int age)

public work getwork()

public void setwork(string company,int salary)

@override

public string tostring() ';

}//這個方法轉殖也可以

/* @override

public prototype clone() throws clonenotsupportedexception */

@override

public prototype clone() throws clonenotsupportedexception

}public class work implements cloneable

public void setcompany(string company)

public void setsalary(int salary)

@override

public string tostring() ';

}@override

public object clone() throws clonenotsupportedexception

}public class main

}

執行的結果如下:

prototype}

總的來說,原型模式在對物件轉殖的時候,需要實現cloneable介面,重寫clone方法,如果該原型的屬性沒有引用型別,則用clone()方法就可以,但是如果屬性中有引用型別的,對於引用型別也要實現cloneable介面,重寫clone()方法,在原型的clone()方法中,對於引用也要clone

設計模式 六 原型模式

原型模式 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。原型模式就是從乙個物件再建立另外乙個可定製的物件,而且不需要知道任何建立的細節。淺複製,深複製 淺複製,複製值型別的實域,對引用型別的實域只複製引用不複製引用的物件,即轉殖出來的物件b和原物件a引用同乙個物件型別的實域c,在b...

設計模式 之六 原型模式ProtoType

設計模式之 六 原型模式prototype 適用範圍 用原型例項指定建立物件的各類並且通過拷貝這些原型建立新的物件 書中例項 簡歷模型。原型模式結構圖如下所示。關鍵 如下 1 父類iprototype.h 抽象方法 virtual iprototype clone 0 iprototype.cpp ...

小話設計模式六 原型模式

原型模式定義 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。原型模式解析 原型模式是一種建立型設計模式,該模式允許乙個物件再建立另外乙個可定製的物件,根本無需知道任何如何建立的細節,工作原理是 通過將乙個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型物件拷貝它們...