文章目录
1. 概念
原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类,即无需关心复杂的复制逻辑。
-
目的:根据一个已有的对象,创建出另外一个一模一样的对象。
-
解决的问题:复杂的复制逻辑
如果你有一个对象, 并希望生成与其完全相同的一个复制品, 你该如何实现呢? 首先, 你必须新建一个属于相同类的对象。 然后, 你必须遍历原始对象的所有成员变量, 并将成员变量值复制到新对象中。不错! 但有个小问题。 并非所有对象都能通过这种方式进行复制, 因为有些对象可能拥有私有成员变量, 它们在对象本身以外是不可见的。
直接复制还有另外一个问题。 因为你必须知道对象所属的类才能创建复制品, 所以代码必须依赖该类。 即使你可以接受额外的依赖性, 那还有另外一个问题: 有时你只知道对象所实现的接口, 而不知道其所属的具体类,比如接口有多个实现类,而你不知道要复制的对象使用的是哪个实现类。
2. 特点
- 优点
- 可以克隆对象, 而无需与它们所属的具体类相耦合。
- 可以克隆预生成原型, 避免反复运行初始化代码。
- 可以更方便地生成复杂对象(比如有多个属性),使用原型模式就不必一一获取再设置。
- 可以用继承以外的方式来处理复杂对象的不同配置。
- 缺点:克隆包含循环引用的复杂对象可能会非常麻烦(深拷贝)
- 适用场景
-
如果你需要复制一些对象,但这个对象的构建比较复杂,使用原型模式就可以无视这种复杂的逻辑直接复制。
-
如果子类的区别仅在于其对象的初始化方式, 那么你可以使用该模式来减少子类的数量。 别人创建这些子类的目的可能是为了创建特定类型的对象。
在原型模式中, 你可以使用一系列预生成的、 各种类型的对象作为原型。客户端不必根据需求对子类进行实例化, 只需找到合适的原型并对其进行克隆即可。类似模具的作用~
-
3. 实现
在讲原型模式之前,先模拟一下普通做法是怎么复制一个对象的,在这种做法下,有两个角色:
- 原型类:被复制的对象
- 客户端:调用复制方法的一端,复制操作也由客户端实现
/**
* 客户端
*/
class client{
/**
* 复制方法
* @param test 原型对象
*/
void copy(Test test){
//new一个对象
Test newTest = new Test();
//根据原型对象注入属性
newTest.setValue(test.getValue());
}
public static void main(String[] args) throws CloneNotSupportedException {
Test test = new Test();
test.setValue(10);
Test clone = copy(test);
System.out.println(clone.getValue())