网站开发 英语词汇,建设网站企业登录,wordpress代码语言,wordpress弹窗插件我们一定对类的实例化比较熟悉#xff0c;前面我们说的单例、还有3种工厂模式都是通过new关键字来创建对象#xff0c;下面我们来了解一种新的对象创建的方式。
1. 定义 原型模式也是一种创建型的设计模式#xff0c;实现和原理总体比较简单#xff0c;一句话总结呢#… 我们一定对类的实例化比较熟悉前面我们说的单例、还有3种工厂模式都是通过new关键字来创建对象下面我们来了解一种新的对象创建的方式。
1. 定义 原型模式也是一种创建型的设计模式实现和原理总体比较简单一句话总结呢就是可以实现用已有的对象创建新的对象而不是用类来实例化对象这样可以起到提升效率的目的。 众所周知类的实例化可以创建对象但其实这是一个比较耗时耗力的工作尤其是在大量实例化对象的业务场景下可能会对系统的性能造成很大的影响。这时候原型模式就可以很好的解决问题用已有的对象来生成对象的副本这里已有的对象就是原型对象副本对象就是拷贝对象。这样对于那些有非常复杂的初始化的操作或者是需要消耗大量资源的情况原型模式的优势就体现出来了。
2. 代码实现 我们来举一个飞机大战的游戏例子游戏的场是在手机屏幕上方飞下来很多敌机而我方战机只有一架其中敌机的飞行轨迹必须是呈上下直线型的我方战机可以上下左右移动。因为本篇我们学习原型模式所以重点关照的是敌机我方战机其实可以通过前面讲的单例模式实现。
2.1 实例化方式 假设游戏过程有500架敌机出现通常情况下使用实例化创建对象的方式代码实现可以这样。
public class EnemyPlain {// x坐标private int x;// y坐标private int y;// 敌机固定x坐标只能上下移动public EnemyPlain(int x) {this.x x;}public int getX() {return x;}public int getY() {return y;}// 手柄每调用一次setY方法Y坐标加一public void setY() {y ;}
}客户端获取敌机的方法如下
public class Client {public static void main(String[] args) {// 500架敌机集合ListEnemyPlain enemyPlains new ArrayList();// 实例化500架敌机for (int i 0; i 500; i) {// 随机出现在0~200的坐标内EnemyPlain enemyPlain new EnemyPlain(RandomUtil.randomInt(200));enemyPlains.add(enemyPlain);}}
}这种代码实现的方式是很常见的但要命的是这500个对象在客户端初始化的时候就会被创建出来500个对象会占用大量的堆内存空间这还是定义的对象只有两个属性的前提下。另外CPU本身就是很宝贵的资源一次性实例化500个对象本身也会消耗系统很大的系统资源极端的情况下会造成游戏界面卡顿造成不友好的用户体验下面我们用原型模式来试一下。
2.2 原型模式 原型模式的代码实现首先把原型类实现java.lang.Clone接口接着实现 clone()方法。
// 1.实现java.lang.Clone接口
public class EnemyPlain implements Cloneable {// x坐标private int x;// y坐标private int y;// 敌机固定x坐标只能上下移动public EnemyPlain(int x) {this.x x;}public int getX() {return x;}public int getY() {return y;}// 手柄每调用一次setY方法Y坐标加一public void setY() {y ;}public void setX(int x) {this.x x;}// 重写克隆 clone 方法Overridepublic EnemyPlain clone() throws CloneNotSupportedException {return (EnemyPlain)super.clone();}
}客户端获取原型拷贝副本代码实现
public class ClientAno {public static void main(String[] args) throws CloneNotSupportedException {// 创建原型对象EnemyPlain enemyPlain new EnemyPlain(100);// 存放500架敌机ListEnemyPlain list new ArrayList();// 克隆500架敌机for (int i 0; i 500; i) {EnemyPlain clonePlain enemyPlain.clone();// 设置横坐标clonePlain.setX(RandomUtil.randomInt(200));list.add(clonePlain);}}
}这里需要特别说明clone()方法并不是从Cloneable接口实现来的而是继承自java.lang.Object对象。另外一般在获取克隆对象的时候可以借助工厂模式一块实现。
3. UML类图 下面就以上面飞机大战这个游戏的这个例子画一个原型模式的UML类图。