本文共 3817 字,大约阅读时间需要 12 分钟。
原型模式属于创建型模式,用原型的实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。调用者不需要关注具体的复制过程,而且不需要知道任何创建的细节,通俗来讲,就是使用一个对象复制一个一模一样的对象出来,目的就是保护最原始的那一份存档。
为什么要保护最原始的那一份存档?以工业生产为例,这里的最原始的那一份存档就相当于工厂中某一商品的模具,其他的所有商品都是由这个模具为雏形,所以,这个模具是不能轻易改变,如果生产了一个商品后,这个商品把模具改变了,那么其后边被生产的产品就不再满足设计要求了。这一特点也决定了原型模式的一个应用场景。
那么原型模式通常应用在哪些方面?
1.从时间成本来说和性能消耗方面来说,假设一个需求中需要创建大量相同的对象,而对象的创建又很耗费时间资源或者空间资源,又不依赖于类的构造方法的时候(clone不会执行构造方法),可以使用原型模式
2.同一个对象,如果存在大量的潜在修改者,每个修改者是基于这个对象最初的状态作修改,相互之间没有影响,可以使用原型模式,例如:我要群发一条邮件,邮件内容,主题,发送时间,等等都是相同的,唯一不同的只有收件人,那么,就可以在这个邮件模版的原型上,通过只修改收件人的值来进行发送即可public interface Prototype { Prototype cloneMessage();}
public interface IMessage extends Prototype{ String content(); String sender(); String receiver(); String image(); String voice(); }
public class ImageMessage implements Cloneable,IMessage{ public String sender; public String content; public String receiver; public String voice; public String image; @Override public String content() { return content; } @Override public String sender() { return sender; } @Override public String receiver() { return receiver; } public void setContent(String content){ this.content = content; } public void setReceiver(String receiver){ this.receiver = receiver; } public void setSender(String sender){ this.sender = sender; } public void setImage(String image){ this.image = image; } public String image() { return image; } @Override public Prototype cloneMessage() { ImageMessage message = new ImageMessage(); message.content = this.content; message.image = this.image; message.receiver = this.receiver; message.sender = this.sender; message.voice = this.voice; return message; } @Override public String voice() { // TODO Auto-generated method stub return null; }}
public class VoiceMessage implements IMessage{ public String sender; public String content; public String receiver; public String voice; private String image; @Override public String content() { return content; } @Override public String sender() { return sender; } @Override public String receiver() { return receiver; } public void setContent(String content){ this.content = content; } public void setReceiver(String receiver){ this.receiver = receiver; } public void setSender(String sender){ this.sender = sender; } public void setVoice(String voice){ this.voice = voice; } public String voice(){ return voice; } @Override public Prototype cloneMessage() { VoiceMessage message = new VoiceMessage(); message.content = this.content; message.voice = this.voice; message.receiver = this.receiver; message.sender = this.sender; message.image = this.image; return message; } @Override public String image() { return image; }}
public class Client { public static void main(String[] args) { VoiceMessage m = new VoiceMessage(); m.setContent("语音消息"); m.setSender("张三"); m.setReceiver("李四"); m.setVoice("语音"); // ImageMessage m = new ImageMessage();// m.setContent("图片消息");// m.setSender("张三");// m.setReceiver("李四");// m.setImage("图片"); MessageEngine.sendMessage(m); }}
public class MessageEngine { public static void sendMessage(IMessage message){ IMessage m = (IMessage) message.cloneMessage(); System.out.println("发送消息----消息内容:"+m.content()+"---消息发送人:"+m.sender()+"---消息接受人:"+m.receiver()+"---图片:"+m.image()+"---语音:"+m.voice()); }}
转载地址:http://qubxa.baihongyu.com/