定义:用原型实例指定建立对象的种类,并经过拷贝这些原型建立新的对象。 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类型。其他的都是浅拷贝。
相关参考:
原型模式(上)
原型模式(下)