zoukankan      html  css  js  c++  java
  • 设计模式之第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:不要丢鸡蛋,那边那位,泥垢了,别砸,别砸了,哎呦喂,我的脸,别砸脸成么,我就是靠这个吃饭的啊。)优点:

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

    原型模式之实现

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

      首先是短信的模板类:

    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

       <。)#)))≦

     

  • 相关阅读:
    API学习
    某社区的常用免费图床 free image hosting websites,如何用Ruby与Perl启动浏览器, 打开指定网页
    Delphi7下SuperObject的JSON使用方法
    Delphi中使用ISuperObject解析Json数据
    Delphi 数据存储到oracle数据库TBLOB/TCLOB的方法 包括JSON串的解析
    Delphi7 JSON的读取和拼接
    SQL查看所有表大小的语句
    ora12541监听程序无法识别连接
    oracle新建用户类问题
    Delphi版本插值Lagrange
  • 原文地址:https://www.cnblogs.com/voidy/p/4240285.html
Copyright © 2011-2022 走看看