原型模式
其实就是指再创建一个对象时,直接从原有的对象进行copy即可,省去对对象进行new以及以后的赋值操作。在jdk中已经自带了这个模式的功能。就是Object对象的clone 方法。这个方法必须实现空接口Cloneable,再调用Object的clone方法就可以获取一个新的对象。
但还需要知道的是浅克隆与深克隆,通常一个复杂点的对象中不光包含了基础的类型还有引用类型的存在。浅克隆只会克隆对象对其中的引用也是进行了copy,但是两对象对其中的对象进行修改后另外一个引用的值也会修改,通常这个是不可以的,这样就有了深克隆,这个深克隆则是对引用对象也进行了克隆操作。
对于浅克隆见下图
而深克隆完成的结果
对于深克隆的实现,就是再进object1克隆时需要对other1也进行克隆并将克隆结果other2并重新复制给object2的引用中。
这个过于简单,实例代码就不写了。
备忘录 memento
关于这个模式也可以理解为快照。作用就是顺时记录某个状态,并且这个记录是可以还原的。差不多就这个意思。类似打游戏的存盘功能,没通关存个盘,快活一下回来接着玩;将当前游戏中的状态进行记录,并将记录进行恢复这就是备忘录 memento模式。
再java中对于对象的记录与恢复,最最最常见的有序列化。jdk也是包含了序列化的接口java.io.Serializable。实现此接口就可完成序列化操作了。
附上我再实际中使用的序列化操作工具:
public class SerializableUtil {
/**
*序列化
*/
public static String serializeToString(Object obj) throws Exception {
byte[] str = serializeToBytes(obj);
return Base64.getEncoder().encodeToString(str);
}
public static byte[] serializeToBytes(Object obj) throws Exception {
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream objOut = new ObjectOutputStream(byteOut);
try {
objOut.writeObject(obj);
byte[] bytes = byteOut.toByteArray();
return bytes;
} finally {
objOut.close();
byteOut.close();
}
}
/**
* 反序列化 字符串序列化为对象
*/
public static <T> T deserializeToObject(String str, Class<T> c) throws Exception {
byte[] s = Base64.getDecoder().decode(str);
return deserializeToObject(s, c);
}
public static <T> T deserializeToObject(byte[] bytes, Class<T> c) throws Exception {
ValidatingObjectInputStream ois = null;
try {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ois = new ValidatingObjectInputStream(bais);
ois.accept(c);
return (T) ois.readObject();
} finally {
if (ois != null)
ois.close();
}
}
}
说明一下:通常序列化完成以后是字节数组。程序可以直接把字节数组输出到文件。或者将字节数组转字符串后再输出到文件。这里字节数组转string的时候我用了base64进行转换。获取到字符串以后可以随意输出了。写文件。保存数据库都可以。
当然把javabean 转 json 或者xml 等其他类型的。也都叫序列化操作。json 或者 xml等 都是序列化的格式了。
模板方法 TemplateMethod
关于TemplateMethod 十分简单。就是重写或者实现一个函数,由系统调用的都为模板方法。这个很是常见,核心就是继承的一种多态实现。
一个简单的例子
//模板类
abstract class Template {
abstract void m1();
abstract void m2();
public void todo() {
m1();
m2();
}
}
// 模板的实现方法
class my_work extends Template {
@Override
void m1() {
System.out.println("i am c1");
}
@Override
void m2() {
System.out.println("i am c2");
}
}
//测试使用
public class TemplateMethod {
public static void main(String[] args) {
Template t = new my_work();
t.todo();
}
}