原型模式
简介
原型模式主要解决的问题就是创建大量重复的类
,而我们模拟的场景就需要给不同的用户都创建相同的试卷,但这些试卷的题目不便于每次都从库中获取,甚至有时候需要从远程的RPC中获取。这样都是非常耗时的,而且随着创建对象的增多将严重影响效率。
在原型模式中所需要的非常重要的手段就是克隆,在需要用到克隆的类中都需要实现implements Cloneable 接口
。
原型模式特点
- 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
- 目标对象是原型对象的一个克隆。也就是说,通过原型模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。
- 根据对象克隆深度层次的不同,有浅度克隆与深度克隆。
代码演示
模拟短信群发的功能
项目结构
/**
* 短信内容模板
*/
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 ApiTest {
@Test
public void testCommodity() throws Exception {
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());
}
}
小结
- 以上的实际场景模拟了原型模式在开发中重构的作用,但是原型模式的使用频率确实不是很高。如果有一些特殊场景需要使用到,也可以按照此设计模式进行优化。
- 另外原型设计模式的优点包括;
便于通过克隆方式创建复杂对象、也可以避免重复做初始化操作、不需要与类中所属的其他类耦合等
。但也有一些缺点如果对象中包括了循环引用的克隆,以及类中深度使用对象的克隆,都会使此模式变得异常麻烦。 终究设计模式是一整套的思想,在不同的场景合理的运用可以提升整体的架构的质量
。永远不要想着去硬凑设计模式,否则将会引起过渡设计,以及在承接业务反复变化的需求时造成浪费的开发和维护成本。- 初期是代码的优化,中期是设计模式的使用,后期是把控全局服务的搭建。不断的加强自己对全局能力的把控,也加深自己对细节的处理。可上可下才是一个程序员最佳处理方式,选取做合适的才是最好的选择。