Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this 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());
}
}
原型模式之使用场景
当遇到以下场景时,就可以考虑使用原型模式了:
- 当要实例化的类是在运行时刻指定时。如:动态装载。
- 当为了避免创建一个与产品类层次平行的工厂时。
- 当一个类的实例只有几个不同的状态组合时。