1.以下是23种GOF设计模式对应的设计原则:
-
工厂方法模式(Factory Method Pattern):遵循开闭原则,客户端不需要修改就能够新增产品类型。
-
抽象工厂模式(Abstract Factory Pattern):遵循开闭原则,客户端不需要修改就能够新增产品族。
-
单例模式(Singleton Pattern):保证系统中只有一个实例,并且能够全局访问。
-
原型模式(Prototype Pattern):通过复制已有对象生成新对象,减少了对象的创建时间。
-
建造者模式(Builder Pattern):将对象的构建与表示分离,使得同样的构建过程能够创建不同的表示。
-
适配器模式(Adapter Pattern):将一个类的接口转换为客户端所期望的另一个接口。
-
桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使得它们能够独立地变化。
-
装饰者模式(Decorator Pattern):动态地为对象添加新的行为。
-
组合模式(Composite Pattern):将对象组合成树形结构,以表示"部分-整体"的层次结构。
-
外观模式(Facade Pattern):提供一个统一接口,用来访问子系统中的一群接口。
-
享元模式(Flyweight Pattern):利用共享技术有效地支持大量细粒度的对象。
-
策略模式(Strategy Pattern):定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
-
模板方法模式(Template Method Pattern):定义一个操作中的算法框架,而将一些步骤延迟到子类中。
-
观察者模式(Observer Pattern):定义一种一对多的依赖关系,当对象状态发生改变时,所有依赖它的对象都会得到通知并自动更新。
-
迭代器模式(Iterator Pattern):提供一种方法访问一个容器对象中各个元素,而又无需暴露该对象的内部细节。
-
代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。
-
命令模式(Command Pattern):将请求封装成对象,从而使能够在不同的请求进行参数化。
-
职责链模式(Chain of Responsibility Pattern):将请求的发送者和接收者解耦,使得多个对象都有机会处理这个请求。
-
备忘录模式(Memento Pattern):在不破坏封装的条件下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
-
状态模式(State Pattern):允许对象在其内部状态改变时改变其行为。
-
访问者模式(Visitor Pattern):定义一种新的操作,在不改变各个元素的类的前提下定义作用于这些元素的新操作。
-
解释器模式(Interpreter Pattern):给定一个语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
-
中介者模式(Mediator Pattern):定义一个中介对象来封装系列对象之间的交互关系。中介者使得各个对象不需要显式地相互作用,从而更松散地耦合了系统。
2.以下是23种GOF设计模式按照不同类型的划分:
- 类创建模式(Class Creation Patterns):关注类和子类的创建,共2种设计模式。
- 工厂方法模式(Factory Method Pattern)
- 抽象工厂模式(Abstract Factory Pattern)
- 对象创建模式(Object Creation Patterns):关注对象的创建和组合,共3种设计模式。
- 原型模式(Prototype Pattern)
- 单例模式(Singleton Pattern)
- 建造者模式(Builder Pattern)
- 类结构模式(Class Structural Patterns):关注类和对象的组合,共6种设计模式。
- 适配器模式(Adapter Pattern)
- 桥接模式(Bridge Pattern)
- 装饰者模式(Decorator Pattern)
- 组合模式(Composite Pattern)
- 外观模式(Facade Pattern)
- 享元模式(Flyweight Pattern)
- 对象结构模式(Object Structural Patterns):关注对象和对象的组合,共4种设计模式。
- 适配器模式(Adapter Pattern)
- 装饰者模式(Decorator Pattern)
- 组合模式(Composite Pattern)
- 代理模式(Proxy Pattern)
- 类行为模式(Class Behavioral Patterns):关注类之间的通信,共3种设计模式。
- 模板方法模式(Template Method Pattern)
- 策略模式(Strategy Pattern)
- 命令模式(Command Pattern)
- 对象行为模式(Object Behavioral Patterns):关注对象之间的通信,共5种设计模式。
- 迭代器模式(Iterator Pattern)
- 观察者模式(Observer Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 备忘录模式(Memento Pattern)
- 状态模式(State Pattern)
- 访问者模式(Visitor Pattern)
- 解释器模式(Interpreter Pattern)
3.组合模式
是一种结构性设计模式,它允许将对象组合成树形结构,使得用户可以以统一的方式处理单个对象和组合对象。组合模式可以分为以下两种类型:
透明式组合模式:所有组件都实现相同的接口,其中包括容器和叶子节点。这样,客户端可以对容器和叶子节点进行相同的操作,而不需要判断当前处理的对象是容器还是叶子节点。
安全式组合模式:容器对象和叶子节点分别实现不同的接口,容器对象中持有一个对所有子节点的引用,而叶子节点没有子节点。客户端需要对容器对象和叶子节点分别进行处理,不能对它们进行统一的操作。安全式组合模式相对于透明式组合模式来说更加灵活,但也更加复杂。
4.懒汉式单例模式和饿汉式单例模式的区别
主要在于对象的实例化时机和线程安全性。
- 对象实例化时机:
- 懒汉式单例模式:在第一次需要使用对象时才进行实例化。这种方式的优点是可以避免只有一部分对象被使用时浪费了系统资源,缺点是在多线程环境下需要保证线程安全。
- 饿汉式单例模式:在类加载时进行实例化,这种方式的优点是避免了线程安全问题,缺点是如果该实例对象未被使用,则会浪费系统资源。
- 线程安全性:
- 懒汉式单例模式:如果要保证线程安全,需要使用同步机制来保证对象只被初始化一次。但是同步机制会影响性能。
- 饿汉式单例模式:由于在类加载时就进行了实例化,所以不存在线程安全问题。
综合来看,懒汉式单例模式适合对象较大,创建时间较长,且不一定每次都需要使用的情况;饿汉式单例模式适合对象较小,创建时间较短,且每次都需要使用的情况。
其优缺点总结如下:
懒汉式单例模式:
- 优点:降低了系统资源的消耗。
- 缺点:线程不安全,需要使用同步机制来保证线程安全,但同步会影响性能。
饿汉式单例模式:
- 优点:线程安全,不需要使用同步机制。
- 缺点:可能浪费系统资源,一旦被加载就无法撤销。
5.简单工厂模式、工厂方法模式和抽象工厂模式的区别
都属于创建型设计模式,它们都关注于对象的创建。
简单工厂模式
通过一个工厂类来创建一些列的产品对象,看起来比较简单,但缺点是当需要增加一个新的产品时,需要修改工厂类的代码,因此不够灵活。
工厂方法模式
通过将具体产品的创建推迟到工厂类的子类中,这样当需要增加一个新的产品时,只需要增加一个新的工厂子类即可。工厂方法模式符合“开闭原则”,但对于复杂的产品族(相关联但并不相同的产品组成的家族),需要创建大量的工厂类,这样会带来一定的开销。
抽象工厂模式
是工厂方法模式的扩展,它提供了一种创建一整套(相关联的)产品对象的方式。在抽象工厂模式中,有一个抽象工厂类,它定义了创建产品的接口,而具体的产品创建则在具体的工厂类中实现。抽象工厂模式可以创建不同类别的产品族,但对于新产品的添加,要求所有的抽象工厂类都需要进行修改才行。
因此,选择哪种设计模式应该根据实际情况进行选择。如果仅存在少量的产品,可以采用简单工厂模式;如果需要创建大量的产品,可以选择工厂方法模式;如果需要创建不同类别的产品族,可以使用抽象工厂模式。
6.产品等级和产品族
产品等级结构:不同工厂生成的同一个类型的产品
产品族:同一个工厂生成的,位于不同产品等级结构中的一组产品
7.原型模式
的核心是通过复制已有的对象来创建新的对象,可以通过克隆来实现。克隆分为深克隆和浅克隆两种方式。
浅克隆
只复制对象本身及其所有基本数据类型的成员变量,而对于其引用类型的成员变量,只是拷贝了其引用地址,因此,浅克隆后得到的新对象和原对象共享引用类型成员变量。
深克隆
则会复制对象本身及其所有成员变量,包括所有的嵌套对象,即使是引用类型成员变量。这意味着深克隆后得到的新对象和原对象相互独立,互不影响。
而实现深克隆有多种方法,例如通过实现Serializable接口的序列化和反序列化方式、实现Cloneable接口的克隆方法、使用第三方库等。需要根据具体情况来选择最适合的实现方法。
需要注意的是,由于深拷贝需要递归遍历所有引用类型成员变量,因此可能会造成性能问题,实际应用时需要权衡选择。
8.类适配器和对象适配器
都是适配器模式的具体实现方式。它们的主要区别在于实现方式不同:
类适配器
使用继承的方式实现,通过继承适配者类和目标类,将适配者类的接口转换为目标类的接口。
对象适配器
使用组合的方式实现,通过在适配器类中包含适配者类的实例以及目标类的实例,将适配者类的接口转换为目标类的接口。
因此,类适配器只能适配单一的适配者类,而对象适配器可以适配多个适配者类。
9.代理模式的类型
远程,虚拟,安全,智能引用