Skip to content

Commit 821d196

Browse files
committed
原型模式更新
1 parent 85daffb commit 821d196

File tree

4 files changed

+80
-0
lines changed

4 files changed

+80
-0
lines changed

Readme.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
解释器模式:interpreter<br>
3030
中介者模式:mediator<br>
3131
备忘录模式:memento<br>
32+
原型模式:prototype<br>
33+
3234

3335
<br><br><br><br><br><br><br><br>
3436

src/prototype/ReadMe.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
原型模式(Prototype)
2+
3+
一、定义
4+
使用原型实例指定创建对象的种类,并且通过拷贝这些原 型创建新的对象。原型模式是一种对象创建型模式。
5+
6+
二、结构
7+
Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。
8+
ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象
9+
Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,
10+
再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,
11+
系统具有较好的可扩展性,增加或更换具体原型类都很方便。
12+
13+
三、优点
14+
当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例可以提高新实例的创建效率。
15+
可以使用深复制的方式保存对象的状态。将对象复制一份并将其状态保存起来,以便于在使用的时候使用,比如恢复到某一个历史状态,可以辅助实现撤销操作。
16+
17+
四、缺点
18+
需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了开闭原则。
19+
为了支持深复制,当对象之间存在多重嵌套引用关系时,每一层对象都必须支持深复制,实现起来可能比较麻烦。
20+
21+
五、应用场景
22+
最主要的应用场景就在于创建新对象成本较大(例如初始化需要占用较长的时间,占用太多的CPU资源或者网络资源),
23+
新的对象可以通过原型模式对已有对象进行复制来获得。如果是相似对象,则可以对其成员变量稍作修改。
24+
25+
六、个人总结
26+
1、当你需要多个属性相同的对象的时候,而且创建新对象的成本较大,需要请求外部资源等,就可以考虑原型模式
27+
2、你可以理解成,原型模式就是克隆几个相同的对象,或者是相似的对象只是稍作修改的情况
28+
3、注意浅拷贝和深拷贝的区别
29+
浅拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
30+
深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package prototype.use;
2+
3+
/**
4+
* 具体原型类
5+
* Created by LinkinStar
6+
*/
7+
public class ConcretePrototype implements Cloneable{
8+
9+
int attributeA;
10+
int attributeB;
11+
int attributeC;
12+
13+
public ConcretePrototype clone() {
14+
try {
15+
return (ConcretePrototype) super.clone();
16+
} catch (CloneNotSupportedException e) {
17+
e.printStackTrace();
18+
}
19+
return null;
20+
}
21+
22+
public void dis(){
23+
System.out.print("属性A:" + attributeA);
24+
System.out.print(" 属性B:" + attributeB);
25+
System.out.println(" 属性C:" + attributeC);
26+
}
27+
28+
}

src/prototype/use/MainTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package prototype.use;
2+
3+
/**
4+
* 使用原型模式
5+
* Created by LinkinStar
6+
*/
7+
public class MainTest {
8+
public static void main(String[] args) throws CloneNotSupportedException {
9+
ConcretePrototype prototypeA = new ConcretePrototype();
10+
prototypeA.attributeA = 1;
11+
prototypeA.attributeB = 2;
12+
prototypeA.attributeC = 3;
13+
ConcretePrototype prototypeB = prototypeA.clone();
14+
ConcretePrototype prototypeC = prototypeA.clone();
15+
prototypeC.attributeA = 3;
16+
prototypeA.dis();
17+
prototypeB.dis();
18+
prototypeC.dis();
19+
}
20+
}

0 commit comments

Comments
 (0)