单例模式
1. 饿汉式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
结构 : 构造器私有化 在类的内部创建对象 向外暴露一个静态的公共方法获取实例
public class Singleton{
public static final Singleton INSTANCE;
private String info;
static {
try {
Properties pro = new Properties();
pro.load(Singleton.class.getClassLoader().getResourceAsStream("Single.properties"));
INSTANCE = new Singleton3(pro.getProperty("info"));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private Singleton(String info){
this.info = info;
}
}
结构 : 在类内部创建静态代码块 在代码块中创建对象
优缺点 : 写法比较简单 在类装载的时候就完成实例化 避免线程了同步问题 , 但是在类装载时就完成了实例化 , 如果没有使用就会造成浪费 而且导致类装载的原因有很多 , 不能保证只有通过制定的方法才导致类的装载
2. 懒汉式
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (null == instance) {
instance = new Singleton();
}
return instance;
}
}
结构 : 创建一个静态方法和静态成员变量方法内对象为null创建返回 不为null直接返回 (不推荐)
优缺点 : 实现了懒加载的效果 但是多线程的情况下同时进入判断就会创建多个 破坏了单例的初衷
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
结构 : 在获取实例的方法上加锁 解决线程安全问题 (不推荐)
优缺点 : 解决了线程安全的问题 但是效率降低 每次执行方法时都需要经过锁同步
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
结构 : 双重检查加锁 (推荐)
优点 : 解决了线程安全问题 当对象被实例化之后就不会进行锁的判断保证了效率下实现单例
3. 静态内部类
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
结构 : 写一个静态内部类 , 该类中有一个静态属性对象 提供一个静态的共有方法 返回对象 (推荐)
优点 : 实例化类时内部类不会立即执行 调用方法时回去实例化内部类 类在加载时是线程安全的
4. 枚举
public enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("我是枚举单例");
}
}
public class Client {
public static void main(String[] args) {
Singleton.INSTANCE.doSomething();
}
}
结构 : 将需要实现单例的对象定义为枚举类 (推荐)
优点 : 利用枚举的特性,让JVM来帮我们保证线程安全和单一实例的问题 ,写法还特别简单
简单工厂
结构 : 定义了一个创建对象的工厂 , 由工厂对象决定创建出哪一个产品类的实例 , 工厂封装对象创建过程 , 当我们会用到大量的某类或者某批对象时 , 就会使用到工厂模式
抽象工厂
结构 : 将产品对象与工厂对象都进行抽象
工厂类模式特点 : 不直接依赖,实现了解耦,将变化装移到工厂,如果需要修改实现或者创建方式只需要修改工厂类代码
工厂模式总结 : 创建一个工厂对象 , 提供获取实例的方法 , 根据使用者不同的参数返回对应的实例 . 这样更换实例或者新增实例时 只需要修改工厂代码 实现了同一管理和维护 应用间的解耦 , 工厂方法 抽象工厂 遵循了设计模式的依赖抽象的原则 提高了代码稳定性 更易扩展
原型模式
定义 : 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,通过拷贝复制出一个新的对象.最简单的设计模式
实现 Cloneable 接口 重写clone() 方法 实现浅copy 通过序列化的方式 实现深copy
创建对象比较复杂时 , 可以利用原型模式简易的创建对象 , 提高效率 不用重新初始化对象 , 而是动态的获得对象运行时的状态
建造者模式
角色 :
Director 指挥者 : 聚合AbstractBuilder , 主要用于创建一个复杂的对象 , 它主要有两个作用 隔离客户与对象的生产过程 , 负责控制产品对象的生产过程
AbstractBuilder 抽象建造者 : 创建一个Product对象的各个部件指定的接口
Builder 具体建造者 : 实现AbstractBuilder , 实现构建Product方法
AbstractProduct 抽象产品 : 与建造者之间依赖
Product 产品 : 一个具体的产品对象
总结 :
创建一个对象需要多条操作时 , 使用建造者模式 ; 抽象建造者 定义需要执行的操作 具体建造者负责实现 指挥者安排执行 消费者只需要创建对应的具体建造者 就可以通过指挥者获取到产品 ; 将一个复杂的创建过程从消费者中抽离 创建方式改变时只需修改指挥者 产品改变时只需改变 具体建造者 实现了产品,创建过程,消费者的解耦达到了灵活运用