-
Notifications
You must be signed in to change notification settings - Fork 0
blackmusic/gupao
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
#####设计模式 ####单例模式 ###应用场景 单例模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并 提供一个全局访问点。单例模式是创建型模式。单例模式在现实生活中应用也非常广泛。 例如,国家主席、公司 CEO、部门经理等。在 J2EE 标准中,ServletContext、 ServletContextConfig 等;在 Spring 框架应用中 ApplicationContext;数据库的连接 池也都是单例形式 ###饿汉式单例 饿汉式单例是在类加载的时候就立即初始化,并且创建单例对象。绝对线程安全,在线 程还没出现以前就是实例化了,不可能存在访问安全问题。 优点:没有加任何的锁、执行效率比较高,在用户体验上来说,比懒汉式更好。 缺点:类加载的时候就初始化,不管用与不用都占着空间,浪费了内存,有可能占着茅 坑不拉屎。 Spring 中 IOC 容器 ApplicationContext 本身就是典型的饿汉式单例 ###懒汉式单例 被外部类调用的时候内部类才会加载 DoubleCheck机制实现线程安全 ###内部类实现单例 内部类不会在其外部类被加载的同时被加载,内部类一定是要在方法调用之前初始化,巧妙地避免了线程安全问题,同事避免了 内存浪费 ###注册式单例 注册式单例又称为登记式单例,就是将每一个实例都登记到某一个地方,使用唯一的标 识获取实例。注册式单例有两种写法:一种为容器缓存,一种为枚举登记 ###枚举登记 枚举类型其实通过类名和 Class 对象类找到一个唯一的枚举对象,可以避免序列化破坏单例 在newInstance()方法中做了强制性的判断,如果修饰符是 Modifier.ENUM 枚举类型, 直接抛出异常,避免了反射破坏单例 ###ThreadLocal线程单例 ThreadLocal 不能保证其创建的对象是全局唯一,但是能保证在单个线程中是唯一的,天生的线程安全 ThreadLocal 将所有的对象全部放在 ThreadLocalMap 中,为每个线程都提供一个对象,实际上是以 空间换时间来实现线程间隔离的 ###小结 单例模式可以保证内存里只有一个实例,减少了内存开销;可以避免对资源的多重占用 ####原型模式 ###使用場景 1、类初始化消耗资源较多。 2、new 产生的一个对象需要非常繁琐的过程(数据准备、访问权限等) 3、构造函数比较复杂。 4、循环体中生产大量对象时 淺克隆 复制的不是值,而是引用的地址。这 样 的 话 , 如 果 我 们 修 改 任 意 一 个 对 象 中 的 属 性 值 , concretePrototype 和 concretePrototypeCone 的 hobbies 值都会改变。这就是我们常说的浅克隆。只是完整 复制了值类型数据,没有赋值引用对象。换言之,所有的引用对象仍然指向原来的对象, 显然不是我们想要的结果 克隆破坏单例模式 如果我们克隆的目标的对象是单例对象,那意味着,深克隆就会破坏单例。实际上防止 克隆破坏单例解决思路非常简单,禁止深克隆便可。要么你我们的单例类不实现 Cloneable 接口;要么我们重写 clone()方法,在 clone 方法中返回单例对象即可
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published