原型模式
定义:原型实例指定创建对象的种类,通过拷贝这些原型创建新的对象
不需要知道创建细节,不调用构造函数;即不通过new,通过方法创建一个相同对象;
new每一个参数都需要手动设置,clone不走构造方法,
原型模式一般两种
浅克隆
实现cloneable接口,没有clone方法,实现在Object,因为Object是所有的父类,clone是一个native方法;
TODO clone对象增加list属性验证
引用对象更改,克隆的对象也会随之更改
没有引用对象或者引用对象对对象不会有影响,可以用浅克隆;浅克隆用的比较少
深克隆
流读取序列化
序列化,实现序列化接口
TODO 类中手写一个深克隆(流读写)方法实现
public Object deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream ops = new ObjectOutputStream(baos);
ops.writeObject(this);
ops.flush();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Object o = ois.readObject();
return o;
}
通过json的api
TODO 通过json实现
public class Test {
public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {
List<String> hobbies = new ArrayList<>();
hobbies.add("chi");
hobbies.add("he");
Student s1 = new Student(0,"liqi",hobbies);
Student student = JSON.parseObject(JSON.toJSONString(s1), Student.class);
System.out.println(s1 == student);
}
}
与单例
原型与单例模式是互斥的
原型模式源码应用
实现了cloneable接口的类,实现cloneable的都是浅克隆
如果容器里面是基本类型就是深克隆,如是引用类型又是浅克隆
ArrayList的clone
HashMap的clone
深克隆实现2
引用对象都实现clone方法,一般不通过这种方法硬编码,序列化会简单直接点
原型模式应用很少
jdk实现了浅克隆;spring、Apache都实现了对象复制类
学习设计模式不是为了使用,为了多一种选择
优缺点
基于内存流读取,简单快速深克隆
必须要有克隆方法,违反开闭原则
实现cloneable的都是浅克隆,深克隆一般需要自己实现
建造者模式
将复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
如example.createCritira().andNoEqualsTo()等
适用于创建需要很多步骤,步骤顺序不一定固定
构建和表示分离,每个方法构建一个属性,也可以链式编程
可以不关心顺序
优缺点
封装性好,创建使用分离;扩展性好
产生多余的builder对象;且要跟随创建的类一起修改
和工厂模式
工厂模式创建的对象都一样;建造者模式创建更复杂,且定制化,可创建不一样的对象;