定義:用原型實例指定建立對象的種類,並經過拷貝這些原型建立新的對象。 html
類型:建立類模式 java
類圖: 設計模式
原型模式主要用於對象的複製,它的核心是就是類圖中的原型類Prototype。Prototype類須要具有如下兩個條件: 數組
原型模式是一種比較簡單的模式,也很是容易理解,實現一個接口,重寫一個方法即完成了原型模式。在實際應用中,原型模式不多單獨出現。常常與其餘模式混用,他的原型類Prototype也經常使用抽象類來替代。 安全
實現代碼: 性能
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
|
class
Prototype
implements
Cloneable
{
public
Prototype
clone
(
)
{
Prototype
prototype
=
null
;
try
{
prototype
=
(
Prototype
)
super
.
clone
(
)
;
}
catch
(
CloneNotSupportedException
e
)
{
e
.
printStackTrace
(
)
;
}
return
prototype
;
}
}
class
ConcretePrototype
extends
Prototype
{
public
void
show
(
)
{
System
.
out
.
println
(
"原型模式實現類"
)
;
}
}
public
class
Client
{
public
static
void
main
(
String
[
]
args
)
{
ConcretePrototype
cp
=
new
ConcretePrototype
(
)
;
for
(
int
i
=
0
;
i
<
10
;
i
++
)
{
ConcretePrototype
clonecp
=
(
ConcretePrototype
)
cp
.
clone
(
)
;
clonecp
.
show
(
)
;
}
}
}
|
原型模式的優勢及適用場景 this
使用原型模式建立對象比直接new一個對象在性能上要好的多,由於Object類的clone方法是一個本地方法,它直接操做內存中的二進制流,特別是複製大對象時,性能的差異很是明顯。 spa
使用原型模式的另外一個好處是簡化對象的建立,使得建立對象就像咱們在編輯文檔時的複製粘貼同樣簡單。 prototype
由於以上優勢,因此在須要重複地建立類似對象時能夠考慮使用原型模式。好比須要在一個循環體內建立對象,假如對象建立過程比較複雜或者循環次數不少的話,使用原型模式不但能夠簡化建立過程,並且可使系統的總體性能提升不少。 設計
原型模式的注意事項
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
class
Prototype
implements
Cloneable
{
private
ArrayList
list
=
new
ArrayList
(
)
;
public
Prototype
clone
(
)
{
Prototype
prototype
=
null
;
try
{
prototype
=
(
Prototype
)
super
.
clone
(
)
;
prototype
.
list
=
(
ArrayList
)
this
.
list
.
clone
(
)
;
}
catch
(
CloneNotSupportedException
e
)
{
e
.
printStackTrace
(
)
;
}
return
prototype
;
}
}
|
因爲ArrayList不是基本類型,因此成員變量list,不會被拷貝,須要咱們本身實現深拷貝,幸運的是java提供的大部分的容器類都實現了Cloneable接口。因此實現深拷貝並非特別困難。
PS:深拷貝與淺拷貝問題中,會發生深拷貝的有java中的8中基本類型以及他們的封裝類型,另外還有String類型。其他的都是淺拷貝。
相關參考:
原型模式(上)
原型模式(下)