-
设计模式不是一成不变的,主要是思想,至于形不需要在意,形只是便于理解罢了
3.1、创建型
这个类型的模式是专门针对于创建对象的,也就是它的适用机制
换言之:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象
3.1.1、单例模式
定义:保证对象全局唯一,即:保证一个类只有一个实例,哪怕是多线程来进行访问,向外提供一个访问此实例的方法即可
使用场景
- 1、数据库连接池不会反复创建
- 2、Spring中一个单例模式Bean的创建
- 3、开发中设置一些全局的属性进行保存(当然:用Redis更好)
3.1.1.1、static实现
package com.zixieqing.o1static;
import java.util.HashMap;
import java.util.Map;
/**
* <p>@description : 该类功能 使用static的方式</p>
* <p>@package : com.zixieqing.o1static</p>
* <p>@author : ZiXieqing</p>
* <p>@version : V1.0.0</p>
*/
public class StaticSingleton {
private static Map<String, String> CACHE = new HashMap<>();
}
- 这种方式在第一次运行时就初始化Map了,不需要延迟加载
- 缺点:需要被继承 或 需要维持一些特定状态时就不适合了
3.1.1.2、懒汉模式
定义:体现在一个“懒”字上,即:需要时才去创建对象
package com.zixieqing.o2lazy;
/**
* <p>@description : 该类功能 懒汉式
* 此种方式不安全:好比多个人抢厕所,会造成不安全,可能有多个人抢到
* </p>
* <p>@package : com.zixieqing.o2lazy</p>
* <p>@author : ZiXieqing</p>
* <p>@version : V1.0.0</p>
*/
public class LazySingleton {
/**
* 1、private static 当前类的属性
*/
private static LazySingleton LAZY_SINGLETON_INSTANCE;
/**
* 2、private 的构造
*/
private LazySingleton() {
}
/**
* 3、提供public static 创建当前类对象的方法
*/
public static LazySingleton getInstance() {
if (null != LAZY_SINGLETON_INSTANCE) return LAZY_SINGLETON_INSTANCE;
LAZY_SINGLETON_INSTANCE = new LazySingleton();
return LAZY_SINGLETON_INSTANCE;
}
/**
* 4、要想稍微安全就加synchronized同步锁
* 但是:此种方式因为把synchronized加在了方法上,导致所有访问争锁而出现 资源的浪费
*/
/* public static synchronized lazy_unsafe_singleton getInstance() {
if (null != LAZY_UNSAFE_INSTANCE_SINGLETON) return LAZY_UNSAFE_INSTANCE_SINGLETON;
LAZY_UNSAFE_INSTANCE_SINGLETON = new Singleton_lazy_unsafe();
return LAZY_UNSAFE_INSTANCE_SINGLETON;
}*/
}
3.1.1.3、饿汉模式
定义:体现在“饿”字上,即:一开始就初始化
package com.zixieqing.o3hunger;
/**
* <p>@description : 该类功能 饿汉式实现
* 这种方式和利用static的方式是异曲同工的
* </p>
* <p>@package : com.zixieqing.o3hunger</p>
* <p>@author : ZiXieqing</p>
* <p>@version : V1.0.0</p>
*/
public class HungerSingleton {
private static HungerSingleton HUNGER_SINGLETON_INSTANCE = new HungerSingleton();
private HungerSingleton() {}
/**
* 这种方式其实也不安全
* 因为当多线程在if判断时如果在同一时刻二者都判断成立为null,就会创建不同的实例
*/
public static HungerSingleton getInstance() {
if (null != HUNGER_SINGLETON_INSTANCE) return HUNGER_SINGLETON_INSTANCE;
HUNGER_SINGLETON_INSTANCE = new HungerSingleton();
return HUNGER_SINGLETON_INSTANCE;
}
}
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/293499.html