??? 原型模式屬于對象的創(chuàng)建模式。
1. 定義
???? 用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象.
2. 工作原理
????? 通過將一個(gè)原型對象傳給那個(gè)要發(fā)動創(chuàng)建的對象,這個(gè)要發(fā)動創(chuàng)建的對象請求原型對象拷貝它們自己來實(shí)施創(chuàng)建.
?????
3. 使用方法
???? Java語言的構(gòu)件模型直接支持原始模型模式.所有的JavaBean都繼承自java.lang.Object,而Object類提供一個(gè)clone()方法,可以將一個(gè)JavaBean對象復(fù)制一份.但是,這個(gè)JavaBean必須實(shí)現(xiàn)一個(gè)標(biāo)識接口Cloneable,表明這個(gè)JavaBean支持復(fù)制.
4. 經(jīng)典應(yīng)用場景
??? 孫悟空在與黃風(fēng)怪的戰(zhàn)斗中,使用了一個(gè)身外身的手段,叫聲"變",變出來百來個(gè)行者.這中手段在面向?qū)ο箢I(lǐng)域里就是原型模式.
??? 嘿嘿,我也用這種方法來“變”出幾個(gè)Amigo來,嘻嘻,一個(gè)去工作,一個(gè)去談戀愛,一個(gè)去跟朋友玩,一個(gè)去跟家人逛吧......
??? 看我的......
/**?*/
/**
?*?設(shè)計(jì)模式-原型模式
?*?
@author
?Amigo?Xie(xiexingxing1121@126.com)
?*?
@since
?2007/03/13?22:20
?
*/
class
?CloneAmigo?
implements
?Cloneable?
{

????
/**?*/
/**
?身高(單位:cm)
*/
????
private
?
int
?height;
????

????
/**?*/
/**
?體重(單位:kg)
*/
????
private
?
int
?weight;
????

????
/**?*/
/**
?年齡
*/
????
private
?
int
?age;


????
/**?*/
/**
?????*?構(gòu)造函數(shù)
?????*?
@param
?height?
?????*?
@param
?weight
?????*?
@param
?age
?????
*/
????
public
?CloneAmigo(
int
?height,?
int
?weight,?
int
?age)?
{
????????
this
.height?
=
?height;
????????
this
.weight?
=
?weight;
????????
this
.age?
=
?age;??
????}
????

????
public
?Object?clone()?
{
????????
//
創(chuàng)建一個(gè)本類對象,并返回給調(diào)用者
?
????????CloneAmigo?temp?
=
?
new??CloneAmigo(height,?weight,?age);
????????return?(Object)temp;
????}
????
public
?
void
?setHeight(
int
?height)?
{????
????????
this
.age?
=
?age;
????}
????pubiic?
int
?getHeight()?
{
????????
return
?height;
????}
????
public
?
void
?setWeight(
int
?weight)?
{
????????
this
.weight?
=
?weight;
????}
????
public
?
int
?getWeight()?
{
????????
return
?weight;
????}
????
public
?
void
?setAge(
int
?age)?
{
????????
this
.age?
=
?age;
????}
????
public
?
void
?getAge()?
{
????????
return
?age;
????}
}
??? 測試類的代碼如下:
public
?
class
??Client?
{

????
public
?
static
?
void
?main(String[]?args)?
{
????????CloneAmigo?amigo1?
=
?
new??CloneAmigo?(158,?45,?24);
????????//通過對一個(gè)Amigo進(jìn)行克隆得到第二個(gè)Amigo
????????CloneAmigo?amigo2?=?(CloneAmigo?)?amigo1.clone();
????????System.out.println("第一個(gè)Amigo的身高:?"?+?amigo1.getHeight());
????????System.out.println("第二個(gè)Amigo的身高:?"?+?amigo2.getHeight());

????????System.out.println("第一個(gè)Amigo的體重:?"?+?amigo1.getWeight());
????????System.out.println("第二個(gè)Amigo的體重:?"?+?amigo2.getWeight());

????????System.out.println("第一個(gè)Amigo的年齡:?"?+?amigo1.getAge());
????????System.out.println("第二個(gè)Amigo的年齡:?"?+?amigo2.getAge());
????}
}
????? 從運(yùn)行結(jié)果可看出兩個(gè)Amigo的身高、體重、年齡都是一樣的。
5. 重點(diǎn)關(guān)注----克隆滿足的條件
????? 1)克隆的對象與原對象不是同一個(gè)對象;
????? 2)克隆對象與原對象的類型一樣;
????? 3)如果對象x的equals()方法定義恰當(dāng)?shù)脑?那么x.clone().equals(x)應(yīng)當(dāng)是成立的。
參考書籍:《Java與模式》
????????????????????《Patterns in Java》
posted on 2007-03-13 23:20
阿蜜果 閱讀(3118)
評論(6) 編輯 收藏 所屬分類:
Design Pattern