设计模式之第9章-原型模式(Java实现)

  “快到春节了,终于快放假了,天天上班好累的说。”“确实啊,最近加班比较严重,项目快到交付了啊。”“话说一到过节,就收到铺天盖地的短信轰炸,你说发短信就发吧,大多数还是一样的,群发。”“就是就是,上次我收到一个,竟然连名字都给弄错了,简直没法说啊,要不然就不发得了,干嘛弄得那么麻烦。”“所以说,才会有群发的短信我不回这个段子嘛。”“对了,今天你不是就要讲那个原型模式什么的,就是类似于群发的是吧。”“嘿嘿,天机不可泄露。”(PS:还天机不可泄露,学会吊起胃口来了。)

原型模式之自我介绍

  鄙人不才,正是原型模式是也,由于实现起来巨简单,所以应用的场景那可是相当的多啊。相关的定义如下:Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.转换成中文就是:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。至于类图如下所示:

  是不是简单的没话说。因为它的核心也就是一个clone方法罢了,通过该方法对对象进行拷贝。而Java又提供了Cloneable接口来标示这个方法是可拷贝的,看到这里有点迷糊?标示算几个意思?因为JDK中没有方法,如果想使用的话,覆盖clone()方法才可以。

原型模式之自我分析

  由于我想了半天都没想出什么缺点,所以只好介绍优点来着,不是我不谦虚啊,真心是没有缺点啊。(PS:不要丢鸡蛋,那边那位,泥垢了,别砸,别砸了,哎呦喂,我的脸,别砸脸成么,我就是靠这个吃饭的啊。)优点:

  • 对客户隐藏了具体的产品类,减少了客户知道名字的数目。
  • 运行时可以增加和删除。
  • 减少子类构造。
  • 用类动态配置应用,性能比较好。

原型模式之实现

  好吧,我有一个恋爱,想和你谈谈,哦,不,口误,是一个原型模式的实现,就说那个短信吧,被人群发是不是很不爽?但是不群发一个一个发又很累是不是?没关系,这时候就是我登场的时候了,让你群发,又不让别人看出来。

  首先是短信的模板类:

  1. public class Template{
  2. //短信内容
  3. private String context = "恭喜发财,红包拿来";
  4.  
  5. //取得内容
  6. public String getContext(){
  7. return this.context;
  8. }
  9. }

  短信类代码:

  1. public class Message implements Cloneable{
  2. //收信人名字
  3. private String receiver;
  4. //短信内容
  5. private String context;
  6. //构造函数
  7. public Message (Template template)
  8. {
  9. this.context = template.getContext();
  10. }
  11.  
  12. @Override
  13. public Message clone(){
  14. Message message = null;
  15. try{
  16. message = (Message)super.clone();
  17. }
  18. catch(CloneNotSupportedException e){
  19. e.printStackTrace();
  20. }
  21. return message;
  22. }
  23.  
  24. //setter/getter方法
  25. public String getContext(){
  26. return context;
  27. }
  28.  
  29. public void setContext(String context){
  30. this.context = context;
  31. }
  32.  
  33. public String getReceiver(){
  34. return receiver;
  35. }
  36.  
  37. public void setReceiver(String receiver){
  38. this.receiver = receiver;
  39. }
  40.  
  41. }

  以上就是具体的原型模式的具体实现。怎么,不知道怎么用是么?好的,来个具体的场景类:

  1. public class Client{
  2. public static void main(String[] args) {
  3. String[] name = {"Jack","Tom","voidy"};
  4. Message message = new Message(new Template());
  5. for (String n :name ) {
  6. message.setReceiver(n);
  7. Message cloneMessage = message.clone();
  8. sendMessage(cloneMessage);
  9. }
  10. }
  11. public static void sendMessage(Message message){
  12. System.out.println(message.getReceiver());
  13. System.out.println(message.getContext());
  14. }
  15. }

  好了,基本上就是那么多了。

原型模式之使用场景

  当遇到以下场景时,就可以考虑使用原型模式了:

  • 当要实例化的类是在运行时刻指定时。如:动态装载。
  • 当为了避免创建一个与产品类层次平行的工厂时。
  • 当一个类的实例只有几个不同的状态组合时。

  恩,本次的设计模式就到此为止。预知后式为何,且听下回分解。

  PS:因水平有限,若有不对之处,欢迎指出,以防误人子弟耳。

   PS:本博客欢迎转发,但请注明博客地址及作者~

   博客地址:http://www.cnblogs.com/voidy/

   博客新址:http://voidy.net

   <。)#)))≦

设计模式之第9章-原型模式(Java实现)的更多相关文章

  1. 设计模式之第7章-外观模式(Java实现)

    设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...

  2. 设计模式之第22章-组合模式(Java实现)

    设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...

  3. 设计模式之第21章-状态模式(Java实现)

    设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...

  4. 设计模式之第20章-访问者模式(Java实现)

    设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...

  5. 设计模式之第17章-备忘录模式(Java实现)

    设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...

  6. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

  7. 设计模式之第14章-命令模式(Java实现)

    设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...

  8. 设计模式之第11章-建造者模式(Java实现)

    设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...

  9. 设计模式之第10章-桥接模式(Java实现)

    设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...

随机推荐

  1. echarts折柱混合(图表数据与x轴对应显示)

    一天24个小时,每个小时不一定都有对应的数据,所以后台给出的数据,只有每个时间点对应的数据,比如4点,给的是112,5点的242,其他时间没有,则只显示4点,5点时候的数据,那么现在对应的时间点就是后 ...

  2. TAS5508 output changing

    1.如果信号从3th通道输入,正常就是从PWM5,6输出,现在要想从PWM7,8输出,就按照以下红线部分选择DAP CH5和DAP CH6,然后写入相应寄存器产生的12 bytes的数组数据即可.

  3. spa 小程序的研发随笔 (2) --- 预编译

    因为是连续写的2篇随笔,废话不多说.直接进入正题. 选择预编译的工具时,笔者采用了gulp.虽然,如今市面上大多采用的多为webpack,使用gulp也是有自己的缘由的. webpack的最主要特点是 ...

  4. Android(java)学习笔记102:Dalivk虚拟机的初始化过程

    1. 初始化下面系统函数(调用dvmStartup函数初始化所有相关的函数) 开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作:    dvmAllo ...

  5. expect脚本中,变量的写法

    一.expect脚本中,变量的不同写法 shell脚本中定义时间变量的写法:time=`date "+%Y%m%d"` ==>>直接照搬到expect中,设置的变量是不 ...

  6. SpringBoot学习4:springboot整合listener

    整合方式一:通过注解扫描完成 Listener 组件的注册 1.编写listener package com.bjsxt.listener; import javax.servlet.ServletC ...

  7. JavaScript之map与parseInt的陷阱

    问题来源 ​ 这个问题的来源是学习廖雪峰老师JS教程.问题如下:小明希望利用map()把字符串变成整数,他写的代码很简洁: 'use strict'; var arr = ['1', '2', '3' ...

  8. node.js express环境下中文需要注意的地方

    问题一: 最近在nuxt项目中开始着手把一些跨域的请求转移到express里,其实跟其他语言差不多,http对象发请求,接收请求都写得很顺畅.之前用的请求部分大多数是get请求,所以除了注意编码问题之 ...

  9. Android Studio 安装与使用ADB wifi 无线调试

    首先,安装ADB WIFI File->Settings->Plugins 其次,用USB连接手机与电脑(并开启手机的调试模式) 任务栏若无提示,即可拔下USB线,开始无线调试 任务栏若是 ...

  10. yii2初步讲解 验证规则

    http://www.yii-china.com/post/detail/9.html