(Java)设计模式:创建型
作者:互联网
-
设计模式不是一成不变的,主要是思想,至于形不需要在意,形只是便于理解罢了
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;
}
}