设计模式之第9章-原型模式(Java实现)
设计模式之第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:不要丢鸡蛋,那边那位,泥垢了,别砸,别砸了,哎呦喂,我的脸,别砸脸成么,我就是靠这个吃饭的啊。)优点:
- 对客户隐藏了具体的产品类,减少了客户知道名字的数目。
- 运行时可以增加和删除。
- 减少子类构造。
- 用类动态配置应用,性能比较好。
原型模式之实现
好吧,我有一个恋爱,想和你谈谈,哦,不,口误,是一个原型模式的实现,就说那个短信吧,被人群发是不是很不爽?但是不群发一个一个发又很累是不是?没关系,这时候就是我登场的时候了,让你群发,又不让别人看出来。
首先是短信的模板类:
public class Template{
//短信内容
private String context = "恭喜发财,红包拿来";
//取得内容
public String getContext(){
return this.context;
}
}
短信类代码:
public class Message implements Cloneable{
//收信人名字
private String receiver;
//短信内容
private String context;
//构造函数
public Message (Template template)
{
this.context = template.getContext();
}
@Override
public Message clone(){
Message message = null;
try{
message = (Message)super.clone();
}
catch(CloneNotSupportedException e){
e.printStackTrace();
}
return message;
}
//setter/getter方法
public String getContext(){
return context;
}
public void setContext(String context){
this.context = context;
}
public String getReceiver(){
return receiver;
}
public void setReceiver(String receiver){
this.receiver = receiver;
}
}
以上就是具体的原型模式的具体实现。怎么,不知道怎么用是么?好的,来个具体的场景类:
public class Client{
public static void main(String[] args) {
String[] name = {"Jack","Tom","voidy"};
Message message = new Message(new Template());
for (String n :name ) {
message.setReceiver(n);
Message cloneMessage = message.clone();
sendMessage(cloneMessage);
}
}
public static void sendMessage(Message message){
System.out.println(message.getReceiver());
System.out.println(message.getContext());
}
}
好了,基本上就是那么多了。
原型模式之使用场景
当遇到以下场景时,就可以考虑使用原型模式了:
- 当要实例化的类是在运行时刻指定时。如:动态装载。
- 当为了避免创建一个与产品类层次平行的工厂时。
- 当一个类的实例只有几个不同的状态组合时。
恩,本次的设计模式就到此为止。预知后式为何,且听下回分解。
PS:因水平有限,若有不对之处,欢迎指出,以防误人子弟耳。
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
设计模式之第9章-原型模式(Java实现)的更多相关文章
- 设计模式之第7章-外观模式(Java实现)
设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...
- 设计模式之第22章-组合模式(Java实现)
设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...
- 设计模式之第21章-状态模式(Java实现)
设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武 ...
- 设计模式之第20章-访问者模式(Java实现)
设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...
- 设计模式之第17章-备忘录模式(Java实现)
设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...
- 设计模式之第16章-代理模式(Java实现)
设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...
- 设计模式之第14章-命令模式(Java实现)
设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...
- 设计模式之第11章-建造者模式(Java实现)
设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...
- 设计模式之第10章-桥接模式(Java实现)
设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...
随机推荐
- <Android 应用 之路> 天气预报(四)
前言 第二次尝试完成天气预报应用,与上次不同的是,个人感觉这次的Ui不那么丑陋,整体的实用性和界面效果,用户体验相较上一次有所提升,但是还是有很多地方需要完善. 这次使用到的内容比较丰富,包括聚合数据 ...
- C#之linq
本文根据30分钟LINQ教程学习作的笔记. 1.Guid.Empty Guid 结构: 表示全局唯一标识符 (GUID).Empty字段:Guid 结构的只读实例,其值均为零.用来设置初始值. G ...
- 流媒体 8——因特网 tcp/ip
1 因特网 1.1 因特网的结构 组成因特网的子网之间在物理上的相互连接都是通过网关设备实现的.通过网关设备互相连接在一起的不同的网络通常称为子网 (subnetwork),因为它们是大网络之中的网络 ...
- 撸了个 django 数据迁移工具 django-supertube
撸了个 django 数据迁移工具 django-supertube 支持字段映射和动态字段转化. 欢迎 star,issue https://github.com/FingerLiu/django- ...
- 【BZOJ1030】[JSOI2007] 文本生成器(AC自动机上跑DP)
点此看题面 大致题意: 给你\(N\)个字符串(只含大写字母),要你求出有多少个由\(M\)个大写字母构成的字符串含有这\(N\)个字符串中的至少一个. \(AC\)自动机 看到题目,应该比较容易想到 ...
- 2018.5.24 Oracle下的sqlplus编程 块结构
1.语句结构模板 declare --声明 begin dbms_output.put_line('Legend Hello world'); end; 2.变量使用 & 是输入符号 decl ...
- python剑指offer 合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. # -*- coding:utf-8 -*- # class ListNode: # def _ ...
- c++question 005 c++中转义字符有哪些?
(1)'\a' 注意,这里不再是两个字符\ 和 a 而是表达了一个具体的含义是,蜂鸣一声 (2)'\n' 换行,这里不再是两个字符\ 和 n 而是表达了一个具体的含义是,相当于 endl (3)'\ ...
- springboot中加入druid对sql进行监控
springboot作为现在十分流行的框架,简化Spring应用的初始搭建以及开发过程,现在我们就使用springboot来进行简单的web项目搭建并对项目sql进行监控. 项目的搭建就省略了,spr ...
- MySQL的备份与恢复理解与备份策略
MySQL的备份主要分为逻辑备份和物理备份 逻辑备份 在MySQL中逻辑备份的最大优点是对各种存储引擎都可以用同样的方法来备份.而物理备份则不同,不同的存储引擎有着不同的备份方法.Mysql中的逻辑备 ...