原型模式(Prototype Pattern)是用于建立重复的对象,同时又能保证性能。这种类型的设计模式属于建立型模式,它提供了一种建立对象的最佳方式。 java
原型模式能够理解为:以一个类做为模板,克隆出无数个类,克隆出来的类与模板就再无关联。设计模式
如下场景可使用原型模式:ide
下面就以提高性能做为场景,来用Java实现原型模式。函数
首先假设一个场景,中秋节将至,系统要为所有的500万(或者更多)用户发送消息(一条条发,先不考虑其余技术实现,主要为了说明原型模式)。这种状况下,若是贸然使用for循环来经过new关键字建立500万个对象,假设new一个对象要花费0.04秒,那么new500万个也未必能在一天以内发送完毕。性能
这种状况下就可使用原型模式来提高性能,下面看类图和代码:优化
代码以下:spa
// 消息模板,继承Cloneable接口 public interface MessageTemplate extends Cloneable { // 克隆消息 MessageTemplate cloneMessage() throws CloneNotSupportedException; } // 消息 public class Message implements MessageTemplate { // 实现克隆方法 public Message cloneMessage() throws CloneNotSupportedException { Message message; message = (Message) clone(); return message; } @Override public String toString() { return "Message{" + "createTime=" + createTime + ", title='" + title + '\'' + ", context='" + context + '\'' + ", phone='" + phone + '\'' + '}'; } // getter and setter ... private Date createTime; private String title; private String context; private String phone; } // 使用克隆模式 public class Client { public static void main(String[] args) throws CloneNotSupportedException { // 模拟发送消息,加入发送100万个消息给不一样用户 // 消息模板使用相同模板,消息内容有某些不一样 // 则可使用原型模式 int count = 100; // 用户数量,就不写100万了 // 建立模板 Message message = new Message(); message.setTitle("节日关怀"); message.setContext("尊敬的%s,您好。吧啦吧啦……"); for (int i = 0; i < count; i++) { Message m = message.cloneMessage(); m.setContext(String.format(message.getContext(), i)); m.setPhone(i + ""); m.setCreateTime(new Date()); System.out.println(m.toString()); } } } // 输出 Message{createTime=Tue May 19 23:05:52 CST 2020, title='节日关怀', context='尊敬的0,您好。吧啦吧啦……', phone='0'} Message{createTime=Tue May 19 23:05:52 CST 2020, title='节日关怀', context='尊敬的1,您好。吧啦吧啦……', phone='1'} Message{createTime=Tue May 19 23:05:52 CST 2020, title='节日关怀', context='尊敬的2,您好。吧啦吧啦……', phone='2'} ...... Message{createTime=Tue May 19 23:05:52 CST 2020, title='节日关怀', context='尊敬的98,您好。吧啦吧啦……', phone='98'} Message{createTime=Tue May 19 23:05:52 CST 2020, title='节日关怀', context='尊敬的99,您好。吧啦吧啦……', phone='99'}
上面的代码就是原型模式的作法和用法。设计
核心就是使用了Java中Object对象自带的clone方法,来完成类的克隆。指针
这里须要注意的是Cloneable接口,它比较特别,clone方法并非它定义的,它只是用来描述对象可使用clone方法,是一种标记接口。code
原型模式的好处,就体现他的使用场景:
原型模式的注意事项,主要强调两点:
忽略构造函数:使用clone()方法,不会触发对象的构造函数,若是类须要在构造函数中进行一些业务,则须要注意;
深拷贝:clone()方法会复制基本类型,可是引用类型复制的是引用的内存地址(指针),因此带有引用类型的对象进行clone()时,须要处理深拷贝,网上有不少文章,就不在此叙述了;
总的来讲,原型模式属于比较简单的设计模式之一,也比较好理解,主要理清2点就能比较好的应用它:
使用场景:在何时适合用原型模式来建立对象;
技术实现:涉及到了使用cloneable接口,使用Object对象的clone方法,以及注意深拷贝;
以上就是我对原型模式的一些理解,有不足之处请你们指出,谢谢。