美文网首页
04.设计模式-原型模式

04.设计模式-原型模式

作者: 任振铭 | 来源:发表于2018-04-13 17:11 被阅读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());
        }
    }
    

    相关文章

      网友评论

          本文标题:04.设计模式-原型模式

          本文链接:https://www.haomeiwen.com/subject/nscfkftx.html