设计模式

本文详细介绍了设计模式的三大类别——创建型、行为型和结构型,包括单例、工厂方法、责任链、迭代器、中介者、观察者等经典模式。阐述了各种模式的核心思想和应用场景,帮助读者理解和应用设计模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要参考https://cyc2018.github.io/CS-Notes/#/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F

 

创建型

1、单例

懒汉式,性能差

public class Singleton {

    private static Singleton uniqueInstance;

    private Singleton() {
    }

    public static synchronized Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

饿汉式,不能通过延迟实例化来节省资源

private static Singleton uniqueInstance = new Singleton();

双检锁,volatile避免重排序,防止返回尚未初始化的uniqueInstance

public class Singleton {

    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }

    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

静态内部类,只有当调用 getUniqueInstance() 方法从而触发 SingletonHolder.INSTANCE 时 SingletonHolder 才会被加载,此时初始化 INSTANCE 实例,并且 JVM 能确保 INSTANCE 只被实例化一次,简单高效。

public class Singleton {

    private Singleton() {
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getUniqueInstance() {
        return SingletonHolder.INSTANCE;
    }
}

枚举实现,该实现是由 JVM 保证只会实例化一次,可以防止反射攻击

public enum Singleton {

    INSTANCE;
}

个人认为内部类和枚举较好,简单高效

 

2、简单工厂,没有Factory的接口,SimpleFactory生产不同类型的ConcreteProduct1,ConcreteProduct2等

 

3、工厂方法,Factory是抽象类,factoryMethod是抽象方法,doSomething处理产品。

 

4、抽象工厂,提供Factory接口,用于创建 相关的对象家族,即多个相关的Product

 

5、建造者(生成器,Builder)模式,封装一个对象的构造过程,并允许按步骤构造。将各个部件的建造请求委派到具体的建造者。比如汽车,拆分成车轮、车门、发动机、方向盘的建造等等,而用户并不关心。

 

6、原型模式(Prototype),使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象,clone()

 

行为型

1、责任链,Handler:定义处理请求的接口,处理请求(handleRequest),并且包含了一个后继链(successor)if (successor != null) { successor.handleRequest(request)};

 

2、命令,将命令封装成对象中。

  • Command:命令
  • Receiver:命令接收者,也就是命令真正的执行者
  • Invoker:通过它来调用命令
  • Client:可以设置命令与命令的接收者

 

3、解释器模式,为语言创建解释器,通常由语言的语法和语法分析来定义。用来解析语义,传入文本Context

 

4、迭代器(Iterator),提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示

  • Aggregate 是聚合类,其中 createIterator() 方法可以产生一个 Iterator;
  • Iterator 主要定义了 hasNext() 和 next() 方法。
  • Client 组合了 Aggregate,为了迭代遍历 Aggregate,也需要组合 Iterator。

 

5、中介者(Mediator)

  • Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信。
  • Colleague:同事,相关对象

Mediator可以定义方法public abstract void doEvent(String eventType);当特定类型的事件发生后,去调度Colleague

 

6、备忘录(Memento)

在不违反封装的情况下获得对象的内部状态,从而在需要时可以将对象恢复到最初状态。

  • Originator:原始对象
  • Caretaker:负责保存好备忘录
  • Menento:备忘录,存储原始对象的的状态。备忘录实际上有两个接口,一个是提供给 Caretaker 的窄接口:它只能将备忘录传递给其它对象;一个是提供给 Originator 的宽接口,允许它访问到先前状态所需的所有数据。理想情况是只允许 Originator 访问本备忘录的内部状态。

 

7、观察者(Observer)

定义对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态。

主题(Subject)是被观察的对象,而其所有依赖者(Observer)称为观察者。

主题(Subject)具有注册和移除观察者、并通知所有观察者的功能,主题是通过维护一张观察者列表来实现这些操作的

观察者(Observer)的注册功能需要调用主题的 registerObserver() 方法。

 

8、状态(State)

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它所属的类。状态机,state不同行为不同。

 

9、策略(Strategy)

定义一系列算法,封装每个算法,并使它们可以互换。

  • Strategy 接口定义了一个算法族,它们都实现了 behavior() 方法。
  • Context 是使用到该算法族的类,其中的 doSomething() 方法会调用 behavior(),setStrategy(Strategy) 方法可以动态地改变 strategy 对象,也就是说能动态地改变 Context 所使用的算法。

 

10、模板方法(Template Method),将一些步骤的实现延迟到子类

 

11、访问者(Visitor),visitor访问element

使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

 

12、空对象(Null),使用什么都不做的空对象来代替 NULL,防止NPE



结构型

1、适配器(Adapter),把一个类接口转换成另一个用户需要的接口。

../_images/Adapter.jpg

 

2、桥接(Bridge),传参时传接口,将抽象与实现分离开来,使它们可以独立变化。

 

3、组合模式(Composite Pattern),依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

class A 里包含List<A>

ç»å模å¼ç UML å¾

 

4、装饰器(Decorator),为对象动态添加功能,在构造器里传入被装饰者

 

5、外观(Facade)

 

6、享元(Flyweight),利用共享的方式来支持大量细粒度的对象,这些对象一部分内部状态是相同的

  • Flyweight:享元对象
  • IntrinsicState:内部状态,享元对象共享内部状态
  • ExtrinsicState:外部状态,每个享元对象的外部状态不同

 

7、代理(Proxy)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值