java设计模式【原型模式】
![](https://img-blog.csdnimg.cn/64218fe0934848fc87bbce8f530375ba.jpeg#pic_center)
抽象模式
原型模式
是一种创建型设计模式,用于在保证性能的情况下创建新的对象实例。
它允许一个对象创建另一个可定制的对象,而无需知道创建的细节。其工作原理是通过拷贝实现对象创建,即clone()。原型模式类似于工厂模式,提供了隔离对象与使用者之间的耦合关系,绕开了new的过程,但需要这些具体的对象有稳定的接口。
原型模式的应用场景包括:利用拷贝替换构造对象,提升效率;避免了重复new相同对象的操作。
优缺点
优点
:
- 性能高:使用原型模式复用的方式创建实例对象,比使用构造函数重新创建对象性能要高。
- 简化创建过程:原型模式可以简化创建的过程,可以直接修改现有的对象实例的值,达到复用的目的。
缺点
:
- 需要实现克隆方法:原型模式需要实现克隆方法,这个方法需要复制对象的所有属性,并且确保对象之间的引用关系正确。
- 可能会引入循环引用:如果对象之间存在循环引用,那么实现克隆方法就变得比较复杂,需要确保循环引用的问题得到解决。
- 可能会违反开闭原则:当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。
总的来说,原型模式在性能和创建过程方面有优势,但需要解决一些克隆方法和循环引用的问题。
浅克隆
将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。
深克隆
将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深克隆进行了完全彻底的复制,而浅克隆不彻底。
Java中Object类是所有类的父类,Object 类提供了一个clone()方法,该方法可以将一个Java对象复制一份,但是需要实现clone的Java类必须要实现一个接口Cloneable,该接口表示该类能够复制且具有复制的能力,如果一个类没有实现这个接口但是调用了clone()方法,Java编译器将会抛出一个CloneNotSupportedException异常。Object类clone()方法是个原生方法,克隆的对象是浅克隆。
原型模式示例
原型模式有以下四个角色:
-
Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,它可以是抽象类也可以是接口,甚至还可以是具体实现类。
-
ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
-
Client(客户类):在客户类中,让一个原型对象克隆自身从而创建一个新的对象,只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。
具体原型类:
/**
* @author physicx
* @date 2023/6/30 上午11:10
* @desc 具体原型类
* Created with IntelliJ IDEA
*/@Data
public class Prototype implements Cloneable {
private String name;
private String age;
private Profession profession;
@Override
public Prototype clone() {
try {
return (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
throw AppCode.B99999.toCodeException("不支持克隆");
}
}
}
/**
* @author physicx
* @date 2023/6/30 上午11:14
* @desc 职业
* Created with IntelliJ IDEA
*/
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Profession {
private String name;
private String type;
}
客户端类:
public static void main(String[] args) {
Prototype prototype = new Prototype();
prototype.setName("张三");
prototype.setAge("16");
prototype.setProfession(new Profession("律师", "专业人士"));
Prototype clone = prototype.clone();
System.out.println("原型对象:" + prototype);
System.out.println("克隆对象:" + clone);
System.out.println("克隆对象和原型对象是否相同:" + (clone == prototype));
System.out.println("克隆对象的引用类型和原型对象引用类型对象是否相同:" + (clone.getProfession() == prototype.getProfession()));
}
这种,Object类相当于抽象原型类,所有实现了Cloneable接口的类相当于具体原型类。
运行客户端调用结果如下:
应用类型克隆后相同,可以看出Object对象的原生clone()方法是浅克隆。
补充说明
后续会依次更新 详解java 23种设计模式,欢迎关注、交流、补充相关内容(如下)。
快捷导航 |
---|
设计模式简介总结 |
单例模式详解 |
工厂方法模式详解 |
抽象工厂模式详解 |
原型模式 |