flying
既然選擇了遠方,只有風雨兼程
BlogJava
|
首頁
| |
發新文章
|
聯系
|
聚合
|
管理
設計模式學習筆記(六)-------原型模式(Prototype)
???名稱:Prototype(原型模式)
?
?? 意圖:用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
?
?? 適用環境:當一個系統應該獨立于它的產品創建、構成和表示時,要使用Prototype模式;以及要實例化的類是在運行時刻指定時,例如,通過動態裝載;或者為了避免創建一個與產品類層次平行的工廠類層次時;或者 當一個類的實例只能有幾個不同狀態組合中的一種時。建立相應數目的原型并克隆它們可能比每次用合適的狀態手工實例化該類更方便一些。
????結構圖:如下
?
java中提供了clone()來實現對象克隆。所以prototype模式變得了很簡單。
只要實現接口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;
????????}
????????
????}
}
深拷貝:上面簡單的調用了Object的clone()方法,此時只是進行了淺拷貝,若Monkey里含有對象成員staff,則用上述方法克隆出的對象與原對象指向同一個對象staff,顯然有時候這并不滿足要求。
深拷貝是指:被復制的對象的所有變量都含有與原來對象相同的值,除去那些引用其它變量的對象。
在Java中可以利用串行化(Serivalized)來實現深拷貝,先使一個對象實現Serializable接口,然后把對象(對象的一個拷貝)寫入一個流中,后再從流里讀出來,這樣便可重復創建對象。
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必須實現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(); //從流中讀出
????}
????}
使用原型模式,有以下結論:
?????????1.在運行時,可以根據需要,以復制的方式增加和刪除類。(登記型原形模式)
???????? 2.可以基于程序條件,在運行時修改一個類的內部數據表示。
???????? 3.還可以在運行時指定新的對象,而無需創建一系列類和繼承結構。
參考資料:《Java與模式》
????????????????????《Java設計模式》
?????????????????? ?
http://www.lvjiyong.com/books/DesignPatterns/16.html
發表于 2006-08-10 03:43
gooogle
閱讀(166)
評論(0)
編輯
收藏
所屬分類:
設計模式
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
設計模式學習總結
設計模式學習筆記(二十四)--------訪問者(Visitor)模式
設計模式學習筆記(二十三)--------策略(Strategy)模式
設計模式學習筆記(二十二)----------模板方法 (Template Method)模式
設計模式學習筆記(二十一)--------備忘錄( Memento)模式
設計模式學習筆記(二十)--------狀態(State) 模式
設計模式學習筆記(十九)--------觀察者(Observer)模式
設計模式學習筆記(十八)---------中介(Mediator)模式
設計模式學習筆記(十七)----------迭代器(Iterator)模式
設計模式學習筆記(十六)---------解釋器(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 客戶端驗證
2.?Struts2整合Spring
3.?Java動態代理的一個例子
4.?Struts2的攔截器
5.?Struts2文件的上傳
6.?在D630上安裝了Ubuntu 8.04.1
7.?struts2類型轉換
8.?用moodle構造課程學習網站
9.?java虛擬機常用參數詳解
10.?初試Java RMI
最新評論
1.?111
111
--11
2.?re: 在struts2中利用ajax進行服務器驗證[未登錄]
啊啊
--啊
3.?re: 在struts2中利用ajax進行服務器驗證[未登錄]
謝謝你了。。。。。。
--皮皮
4.?re: struts2 客戶端驗證
為什么會拋出異常???
--永恒的興
5.?re: 用moodle構造課程學習網站
誰能給個汽修學習網站!
--..
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 gooogle
主站蜘蛛池模板:
民乐县
|
富蕴县
|
阳信县
|
曲周县
|
惠州市
|
天津市
|
乐清市
|
西林县
|
巴南区
|
那曲县
|
巴彦淖尔市
|
长沙县
|
井研县
|
绵竹市
|
聂拉木县
|
赤城县
|
邯郸县
|
阿图什市
|
简阳市
|
五莲县
|
呼和浩特市
|
漠河县
|
隆德县
|
张掖市
|
长乐市
|
玛沁县
|
团风县
|
阳高县
|
柞水县
|
溧阳市
|
呈贡县
|
上犹县
|
女性
|
灌阳县
|
香港
|
南部县
|
松滋市
|
军事
|
安图县
|
济阳县
|
蕉岭县
|