flying
既然選擇了遠(yuǎn)方,只有風(fēng)雨兼程
BlogJava
|
首頁(yè)
| |
發(fā)新文章
|
聯(lián)系
|
聚合
|
管理
設(shè)計(jì)模式學(xué)習(xí)筆記(六)-------原型模式(Prototype)
???名稱:Prototype(原型模式)
?
?? 意圖:用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。
?
?? 適用環(huán)境:當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)建、構(gòu)成和表示時(shí),要使用Prototype模式;以及要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí),例如,通過(guò)動(dòng)態(tài)裝載;或者為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平行的工廠類層次時(shí);或者 當(dāng)一個(gè)類的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些。
????結(jié)構(gòu)圖:如下
?
java中提供了clone()來(lái)實(shí)現(xiàn)對(duì)象克隆。所以prototype模式變得了很簡(jiǎn)單。
只要實(shí)現(xiàn)接口Cloneable就可以了
package
?prototype;
import
?java.util.Date;
import
?java.io.
*
;
public
?
class
?Monkey?
implements
?Cloneable
{
????
private
?
int
?height;
????
private
?
int
?weight;
????
private
?GoldRingedStaff?staff;
????
private
?Date?birthDate;
????
????
public
?Monkey()
{
????????birthDate
=
new
?Date();
????????staff
=
new
?GoldRingedStaff();
????}
?
???? ????
//
淺拷貝
???????
??
public
?Object?clone()
{
????????Monkey?temp
=
null
;
????????
try
{
????????????temp
=
(Monkey)
super
.clone();
????????}
catch
(CloneNotSupportedException?e)
{
????????}
finally
{
????????????
return
?temp;
????????}
????????
????}
}
深拷貝:上面簡(jiǎn)單的調(diào)用了Object的clone()方法,此時(shí)只是進(jìn)行了淺拷貝,若Monkey里含有對(duì)象成員staff,則用上述方法克隆出的對(duì)象與原對(duì)象指向同一個(gè)對(duì)象staff,顯然有時(shí)候這并不滿足要求。
深拷貝是指:被復(fù)制的對(duì)象的所有變量都含有與原來(lái)對(duì)象相同的值,除去那些引用其它變量的對(duì)象。
在Java中可以利用串行化(Serivalized)來(lái)實(shí)現(xiàn)深拷貝,先使一個(gè)對(duì)象實(shí)現(xiàn)Serializable接口,然后把對(duì)象(對(duì)象的一個(gè)拷貝)寫入一個(gè)流中,后再?gòu)牧骼镒x出來(lái),這樣便可重復(fù)創(chuàng)建對(duì)象。
package
?prototype;
import
?java.util.Date;
import
?java.io.
*
;
public
?
class
?Monkey?
implements
?Cloneable,Serializable
{
????
private
?
int
?height;
????
private
?
int
?weight;
????
private
?GoldRingedStaff?staff;?? //GoldRingedStaff必須實(shí)現(xiàn)Serializable接口
????
private
?Date?birthDate;
????
????
public
?Monkey()
{
????????birthDate
=
new
?Date();
????????staff
=
new
?GoldRingedStaff();
????}
????????
//
深拷貝
????
public
?Object?deepClone()
throws
?IOException,ClassNotFoundException
{
????????ByteArrayOutputStream?bo
=
new
?ByteArrayOutputStream();
????????ObjectOutputStream?oo
=
new
?ObjectOutputStream(bo);
????????oo.writeObject(
this
); //寫入流中
????????ByteArrayInputStream?bi
=
new
?ByteArrayInputStream(bo.toByteArray());
????????ObjectInputStream?oi
=
new
?ObjectInputStream(bi);
????????
return
?oi.readObject(); //從流中讀出
????}
????}
使用原型模式,有以下結(jié)論:
?????????1.在運(yùn)行時(shí),可以根據(jù)需要,以復(fù)制的方式增加和刪除類。(登記型原形模式)
???????? 2.可以基于程序條件,在運(yùn)行時(shí)修改一個(gè)類的內(nèi)部數(shù)據(jù)表示。
???????? 3.還可以在運(yùn)行時(shí)指定新的對(duì)象,而無(wú)需創(chuàng)建一系列類和繼承結(jié)構(gòu)。
參考資料:《Java與模式》
????????????????????《Java設(shè)計(jì)模式》
?????????????????? ?
http://www.lvjiyong.com/books/DesignPatterns/16.html
發(fā)表于 2006-08-10 03:43
gooogle
閱讀(168)
評(píng)論(0)
編輯
收藏
所屬分類:
設(shè)計(jì)模式
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
相關(guān)文章:
設(shè)計(jì)模式學(xué)習(xí)總結(jié)
設(shè)計(jì)模式學(xué)習(xí)筆記(二十四)--------訪問(wèn)者(Visitor)模式
設(shè)計(jì)模式學(xué)習(xí)筆記(二十三)--------策略(Strategy)模式
設(shè)計(jì)模式學(xué)習(xí)筆記(二十二)----------模板方法 (Template Method)模式
設(shè)計(jì)模式學(xué)習(xí)筆記(二十一)--------備忘錄( Memento)模式
設(shè)計(jì)模式學(xué)習(xí)筆記(二十)--------狀態(tài)(State) 模式
設(shè)計(jì)模式學(xué)習(xí)筆記(十九)--------觀察者(Observer)模式
設(shè)計(jì)模式學(xué)習(xí)筆記(十八)---------中介(Mediator)模式
設(shè)計(jì)模式學(xué)習(xí)筆記(十七)----------迭代器(Iterator)模式
設(shè)計(jì)模式學(xué)習(xí)筆記(十六)---------解釋器(Interpreter)模式
<
2006年8月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
留言簿
(2)
給我留言
查看公開留言
查看私人留言
搜索
最新隨筆
1.?struts2 客戶端驗(yàn)證
2.?Struts2整合Spring
3.?Java動(dòng)態(tài)代理的一個(gè)例子
4.?Struts2的攔截器
5.?Struts2文件的上傳
6.?在D630上安裝了Ubuntu 8.04.1
7.?struts2類型轉(zhuǎn)換
8.?用moodle構(gòu)造課程學(xué)習(xí)網(wǎng)站
9.?java虛擬機(jī)常用參數(shù)詳解
10.?初試Java RMI
最新評(píng)論
1.?111
111
--11
2.?re: 在struts2中利用ajax進(jìn)行服務(wù)器驗(yàn)證[未登錄](méi)
啊啊
--啊
3.?re: 在struts2中利用ajax進(jìn)行服務(wù)器驗(yàn)證[未登錄](méi)
謝謝你了。。。。。。
--皮皮
4.?re: struts2 客戶端驗(yàn)證
為什么會(huì)拋出異常???
--永恒的興
5.?re: 用moodle構(gòu)造課程學(xué)習(xí)網(wǎng)站
誰(shuí)能給個(gè)汽修學(xué)習(xí)網(wǎng)站!
--..
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 gooogle
主站蜘蛛池模板:
亚欧色视频在线观看免费
|
免费观看四虎精品成人
|
色欲A∨无码蜜臀AV免费播
|
亚洲欧美一区二区三区日产
|
一区二区免费视频
|
激情内射亚洲一区二区三区
|
亚洲国产精品免费在线观看
|
黑人粗长大战亚洲女2021国产精品成人免费视频
|
在线免费观看你懂的
|
亚洲日本在线播放
|
免费a级毛片高清视频不卡
|
色婷五月综激情亚洲综合
|
4hu四虎免费影院www
|
av无码免费一区二区三区
|
亚洲成?v人片天堂网无码
|
亚洲精品无码久久毛片波多野吉衣
|
午夜精品一区二区三区免费视频
|
亚洲精品乱码久久久久久按摩
|
国产免费一区二区视频
|
国产a v无码专区亚洲av
|
狠狠色香婷婷久久亚洲精品
|
热久久精品免费视频
|
亚洲视频一区二区在线观看
|
中国在线观看免费高清完整版
|
亚洲欧洲日产国码高潮αv
|
中文字幕无线码免费人妻
|
久久国产亚洲高清观看
|
中文字幕无码视频手机免费看
|
亚洲AV噜噜一区二区三区
|
国产午夜精品免费一区二区三区
|
一级人做人爰a全过程免费视频
|
成视频年人黄网站免费视频
|
亚洲精品国产精品
|
ww4545四虎永久免费地址
|
亚洲爆乳精品无码一区二区
|
久久久久国产成人精品亚洲午夜
|
88xx成人永久免费观看
|
国产亚洲视频在线观看网址
|
国产成人免费高清在线观看
|
亚洲色大情网站www
|
国内外成人免费视频
|