单例设计模式
作用:减少系统开销,优化资源共享访问
UML:
分类
1)、饿汉式(不可延时加载) 可能造成资源浪费
枚举型:天然的单例设计模式(可防止反射和反序列化)
enum EnumUnique {
//该属性是枚举EnumUnique的实例
instance;
//可添加方法
public void operation() {
System.out.println("枚举单例设计模式");
}
}
2)、懒汉式 (可延时加载)
①double checking (synchronized,volatile(防止指令重排,同步数据)):受JVM底层机制影响,一般不使用 。
②静态内部类式:类的加载是天然线程安全,加载一个类时,其内部类不会同时被加载。
一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
PS:单例设计模式会被破解
①反序列化(将对象写入文件,再提取出来)
序列化时,需实现Serializable接口,防止反序列化可定义readResolve():是一种回调,直接返回对象。
private Object readResolve() throws ObjectStreamException{
return instance;
}
②反射(提取私有构造器强制建立对象)
防止方法:可在构造器中手动抛出异常
工厂模式(Product + Factory)
①简单工厂模式(直接建立工厂)
可扩展性低,只能进行修改
ps:可在工厂中通过反射获取对象来解决修改问题
UML:
②工厂方法模式(使用接口,实现接口建立不同的工厂)
满足开闭原则:对修改关闭,对扩展开放,但较为复杂,一般推荐使用简单工厂模式
前两者都只针对与一个产品。
③抽象工厂模式(具有多个产品,通过工厂可以创建多个产品)
针对于一条线上的多个产品,不能增加新的产品,只能增加产品族
UML:
建造者模式 (Builder(实现接口) + Director)
Builder : 创造组件(可与工厂模式联系)
Director :进行装配(返回装配成功后的对象)
UML:
原型模式(prototype)
通过new产生一个对象需要非常繁琐的数据准备或访问权限,则使用原型模式(进行克隆:类似于new,不同于new)
产生对象属性值相同,但存储位置不同,即引用不同,是两个不同的对象。
内存复制操作:
java中提供了clone()(必须实现Cloneable接口:标记接口)
重写clone()通过super调用基类clone(),将所得对象直接进行返回
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
ps: clone()方法是object的方法,本地方法
浅克隆:在克隆新的对象时,新旧两个对象引用属性所指向的是同一个数据
深克隆:克隆出的新的对象,将引用属性也进行拷贝
深克隆的实现:在clone()方法中,将对象的引用属性也进行clone操作
如:对于date对象
@Override
protected Object clone() throws CloneNotSupportedException {
//将克隆对象的引用属性也进行克隆
Object object = super.clone();
PassiveDeepClone deep = (PassiveDeepClone)object;
deep.whDate = (Date)this.whDate.clone();
return deep;
}
UML: