原型模式

发布时间: 更新时间: 总字数:616 阅读时间:2m 作者: IP上海 分享 网址

Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)

原型模式介绍

类图如下所示:

prototype

它的核心也就是一个clone方法,通过该方法对对象进行拷贝

原型模式分析

优点:

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

原型模式之实现

Golang 示例

Java 示例

Java又提供了Cloneable接口来标示这个方法是可拷贝的,看到这里有点迷糊?标示算几个意思?因为JDK中没有方法,如果想使用的话,覆盖clone()方法才可以。

首先是短信的模板类:

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());
    }
}

原型模式之使用场景

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

  • 当要实例化的类是在运行时刻指定时。如:动态装载。
  • 当为了避免创建一个与产品类层次平行的工厂时。
  • 当一个类的实例只有几个不同的状态组合时。
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数