一.什么是原型模式
原型模式就是从从一个对象创建再另外一个可定制对象,并且不需要知道创建的细节
二.原型模式怎么写
1.我们先来看看原型模式的UMLl类图
2.我们根据类图来写一写原型模式
public abstract class Prototype {
public String name;
public abstract void setName(String name);
public abstract String getName();
public abstract Prototype clonePro();
}
public class ConcretePrototype extends Prototype {
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public ConcretePrototype clonePro() {
ConcretePrototype concretePrototype=new ConcretePrototype();
concretePrototype.setName(this.name);
return concretePrototype;
}
}
客户端调用
public class Client {
public static void main(String[] args) {
Prototype prototype=new ConcretePrototype();
prototype.setName("小明");
System.out.println("对象:"+prototype+"对象属性:"+prototype.getName());
Prototype clonePrototype=prototype.clonePro();
System.out.println("对象:"+clonePrototype+"对象属性:"+clonePrototype.getName());
}
}
我们将打印结果展示出来:
对象:com.seven.prototype.ConcretePrototype@15db9742对象属性:小明
对象:com.seven.prototype.ConcretePrototype@6d06d69c对象属性:小明
这样我们就克隆了原始的对象
三.深拷贝和浅拷贝
通过上面的例子,我相信都会写原型模式了,在来说说深浅拷贝的问题,首先我们要了解这个概念。
浅拷贝:如果是基本数据类型,直接复制,如果是引用数据类型则赋值地址。也就是浅拷贝中,如果拷贝对象的引用数据类型的里面数据改变了,则都会改变,
深拷贝:如果是引用数据的拷贝,则重新创建,各种独立,修改时不影响其他的克隆对象
1.我们通过Cloneable 来实现浅拷贝
/**
* @author Seven 通过Cloneable浅拷贝
*
*/
public class Prototype implements Cloneable {
private class MyPrototype implements Serializable
{
}
private String name;
public MyPrototype MyPrototype=new MyPrototype();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Prototype clone() throws CloneNotSupportedException {
Object obj = null;
try {
obj = super.clone();
return (Prototype) obj;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
System.out.println("不支持克隆方法!");
return null;
}
}
}
2.我们通过序列化实现深拷贝
public class Prototype implements Serializable{
private class MyPrototype implements Serializable
{
}
private String name;
public MyPrototype MyPrototype=new MyPrototype();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/** 深拷贝
* @return
* @throws Exception
*/
public Prototype deepClone() throws Exception {
// 将对象写入流中,
ByteArrayOutputStream byteos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(byteos);
oos.writeObject(this);
// 将对象取出来
ByteArrayInputStream bi = new ByteArrayInputStream(byteos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bi);
return (Prototype) ois.readObject();
}
}
下面是打印
浅拷贝对象:com.seven.prototype.clone.Prototype@15db9742属性:小浅,com.seven.prototype.clone.Prototype
M
y
P
r
o
t
o
t
y
p
e
@
6
d
06
d
69
c
浅
拷
贝
对
象
:
c
o
m
.
s
e
v
e
n
.
p
r
o
t
o
t
y
p
e
.
c
l
o
n
e
.
P
r
o
t
o
t
y
p
e
@
7852
e
922
属
性
:
小
浅
,
c
o
m
.
s
e
v
e
n
.
p
r
o
t
o
t
y
p
e
.
c
l
o
n
e
.
P
r
o
t
o
t
y
p
e
MyPrototype@6d06d69c 浅拷贝对象:com.seven.prototype.clone.Prototype@7852e922属性:小浅,com.seven.prototype.clone.Prototype
MyPrototype@6d06d69c浅拷贝对象:com.seven.prototype.clone.Prototype@7852e922属性:小浅,com.seven.prototype.clone.PrototypeMyPrototype@6d06d69c
深拷贝对象:com.seven.prototype.clone.Prototype@4e25154f,属性:小深,com.seven.prototype.clone.Prototype
M
y
P
r
o
t
o
t
y
p
e
@
70
d
e
a
4
e
深
拷
贝
对
象
:
c
o
m
.
s
e
v
e
n
.
p
r
o
t
o
t
y
p
e
.
c
l
o
n
e
.
P
r
o
t
o
t
y
p
e
@
3
b
9
a
45
b
3
,
属
性
:
小
浅
,
c
o
m
.
s
e
v
e
n
.
p
r
o
t
o
t
y
p
e
.
c
l
o
n
e
.
P
r
o
t
o
t
y
p
e
MyPrototype@70dea4e 深拷贝对象:com.seven.prototype.clone.Prototype@3b9a45b3,属性:小浅,com.seven.prototype.clone.Prototype
MyPrototype@70dea4e深拷贝对象:com.seven.prototype.clone.Prototype@3b9a45b3,属性:小浅,com.seven.prototype.clone.PrototypeMyPrototype@7699a589
我们可以通过打印看出来,深浅拷贝的差别也就是对引用对象拷贝的差别
四.总结
本文介绍了什么是原型模式以及原型模式的写法,深浅拷贝的区别以及实现方式,如果本文对你有用,可以点个赞,如果有不正之处,欢迎留下你的评论,谢谢!