本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
在面试中,设计模式,源码、数据结构、框架原理、JVM、GC、中间件等一个也少不了,所有的这些东西都需要平时进行积累。我这里后面会做一个专题,把设计模式单独做成一个菜单,方便后面面试的各位网友。
在 Java 中创建对象的方法有很多,比如:通过 new、反射、Object.clone、反序列化、Unsafe.allocateInstance 等。他们的用处各不相同,今天我借助 Object.clone 来讲一个原型设计模式。
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
在现实生活中也处处离不开原型模式。比如,细胞的分裂等。
原型模式非常的简单。简单到可以用下面的 3 个类搞定它的类图。
我们常见的游戏打飞机,或者植物大战僵尸。都可以利用到原型设计模式。
每个飞机,或者炮弹的坐标可能不一样,但是要产生非常多的飞机,如果一个一个的来创建,代价太高,因此,我们可以使用原型模式来解决。
public class AirPlane implements Cloneable{
private int x;//横坐标
private int y = 0;//纵坐标
public AirPlane(int x) {//构造器
this.x = x;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void fly(){
y += 5;
}
//重写克隆方法
@Override
public AirPlane clone() throws CloneNotSupportedException {
return (AirPlane)super.clone();
}
}
原型模式非常的简单,有些网友可能会觉得难,那是因为它的使用场景你没有搞清楚。下面我总结了一下原型模式的常用场景。
- 资源优化场景。
- 类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
- 性能和安全要求的场景。
- 通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
- 一个对象多个修改者的场景。
- 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
- 在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。
通过这几个场景,我们也可以看出来,原型模式:能够提高性能;同时还能够逃避构造函数的约束。但是除了这两个优点外,缺点也很明显。必须实现 Cloneable 接口;并且特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候,克隆的深度你就得通盘考虑了。
设计模式很多人都看过很多遍了,但是一到面试还是不会。原因就是使用的场景不熟悉,并且没有在正式的代码中使用过。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 设计模式系列,原型模式