Fork me on GitHub

新博客地址:voidy's blog

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

Posted on 2015-01-22 12:59  尛鱼  阅读(983)  评论(2编辑  收藏  举报

设计模式之第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 
42 }
View Code

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

 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 }
View Code

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

原型模式之使用场景

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

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

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

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

 

 

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

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

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

   <。)#)))≦