博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
04.设计模式-原型模式
阅读量:6304 次
发布时间:2019-06-22

本文共 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/

你可能感兴趣的文章
陶哲轩实分析习题9.8.5 : 在有理点间断,无理点连续的严格单调函数
查看>>
五本珍稀数学电子书出售
查看>>
公司项目git开发流程规范
查看>>
Google今日更新了全球排名前100名的网站排行版
查看>>
传奇世界RollBall设计
查看>>
JS-元素大小深入学习-offset、client、scroll等学习研究笔记
查看>>
shell script中引号的用法
查看>>
实验3
查看>>
脚本执行策略设置
查看>>
接口和抽象类是否继承了Object
查看>>
Angular.js+Bootstrap实现表格分页
查看>>
面试题10-二进制中1的个数
查看>>
ahjesus 让Boot Camp支持创建win7 u盘安装盘
查看>>
(3)合并列值与分拆列值
查看>>
C# 核心编程结构Ⅱ 笔记
查看>>
OCP最新题库052考题解析及答案-第37题
查看>>
Linux服务器Java输出文件中文乱码
查看>>
利用剩余磁盘空间新建分区
查看>>
在程序中使用Response.End时发生异常“正在终止线程”
查看>>
FROM USE CASES TO TEST CASES
查看>>