记录一下学习GOF(一)

119 阅读3分钟

一、设计模式

设计模式分为三大块,创建模式、结构模式和行为模式。
  • 创建模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式

  • 结构型模式:适配器模式、装饰模式、组合模式、外观模式、享元模式、代理模式

  • 行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式

单例模式

保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
例如:Windows TaskManager、Recycle Bin、网络计数器、文件系统、数据连接池
优点:只生成一个实例,内存开销较小
实现方法:饿汉式、懒汉式、双重检测锁式、静态内部类、枚举单例

普通方式:饿汉和懒汉

1 _饿汉:饿汉不可以实现延时加载
2 _懒汉:懒汉在加载时有锁,效率低,否则线程不安全

## 饿汉式:

  • 私有的构造器

  • 静态对象(直接加载) 不能延时、立即加载

  • 公有getInstance() static return instance

加载类、天然的线程安全

## 懒汉式:

  • 私有构造器
  • 静态对象(没有初始化)
  • getInstance() instance != null <- 线程问题 同步锁 synchronized

资源利用率高了,但每次都要同步并发效率低。

## 双重检测锁

将同步块放在if块中 不推荐使用,在不同的JVM中可能会有错误

## 静态内部类

public class SingletonDemo{
    private static class SingletonClassInstance{
        private static final SingletonDemo instance = new SingletonDemo();
    }
    public static SingletonDemo getInstance(){
        return SingletonClassInstance.Instance;
    }
    private SingletonDemo(){
        
    }
}
  • 外部类没有static属性,则不会像饿汉式那样立即加载对象。
  • 只有真正调用getInstance(),才会加载静态内部类。加载类时是线程安全的。instance是static final 类型,保证了内存中只有这样一个实例存在,而且只能被赋值一次,从而保证了线程安全性。
  • 兼备了并发高效调用和延迟加载的优势

## 枚举模式

简单、好用
没有延时加载;防止反射和反序列化漏洞

工厂模式

实现了创建者和调用者的分离
用方法代替new操作
面向对象设计的基本原则:
  • OCP(开闭原则):一个软件的实体应当对扩展开放,对修改关闭。

  • DIP(依赖倒转原则):要针对接口编程,不要针对实现编程。

  • LoD(迪米特法则):只与你直接的朋友通信,而避免和陌生人通信。

    简单工厂:又称为静态工厂 违反开闭原则

    但是只要对工厂类进行修改,代码量不大

    工厂方法模式:代码量较大,符合开闭原则

抽象工厂模式

对产品族进行抽象实现

建造者模式

单独构造和装配的分离

原型模式

避免重新执行构造步骤
实现数据复用
实现cloneable接口和重写clone()
cloneable空标记接口  代码规范
浅克隆:克隆引用对象地址
深克隆:同时复制一份对象(在clone()中添加)

也可以通过序列化和反序列化复制(深克隆)