- 什么是设计模式
-
- 定义:是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案
- 本质:本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解
- 类的设计原则
- 单一职责原则:
- 单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化的中心。
- 多个职责耦合在一起,影响复用性
- 里氏代换原则
- 要求继承是严格的is-a关系
- 所有引用基类的地方必须能透明地使用其子类的对象
- 依赖倒置原则
- 依赖倒置原则的核心就是要我们面向接口编程
- 变量的声明类型尽量是抽象类或接口。
- 接口隔离原则
- 客户端不应该依赖它不需要的接口,需要什么就提供什么,不需要的就不要提供
- 迪米特法则
- 迪米特法则(Law of Demeter)又叫作最少知识原则(Least Knowledge Principle 简写LKP)
- 一个类应该对自己需要耦合或调用的类知道的最少,类与类之间的关系越密切,耦合度越大,那么类的变化对其耦合的类的影响也会越大
- 面向设计的核心原则:低耦合,高内聚
- 开闭原则
- 对修改关闭,对扩展开放
- 单一职责原则:
- 类和类之间的关系
- 继承关系:父子继承
- 实现关系:class类指向接口
- 依赖关系:类B作为参数被类A在某个method方法中使用
- 关联关系:被关联类B以类的属性形式出现在关联类A中
- 聚合关系:关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系
- 组合关系:也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合
- 模式分类
- 创建类
- 主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度
- 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式
- 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例
- 工厂方法(FactoryMethod)模式:定义一个用于创建产品的接口,由子类决定生产什么产品
- 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品
- 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成复杂对象
- 结构型
- 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象
- 1. 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性
- 2. 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
- 3. 桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现的,从而降低了抽象和实现这两个可变维度的耦合度
- 4. 装饰(Decorator)模式:动态地给对象增加一些职责,即增加其额外的功能。
- 5. 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
- 6. 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用
- 7. 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性
- 行为型模式
- 行为型模式用于描述程序在运行时复杂的流程控制,它涉及算法与对象间职责的分配合在对象间分配行为。
- 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚;对象行为模式比类行为模式具有更大的灵活性
- 模板方法
- 策略(Strategy)模式
- 命令(Command)模式
- 职责链(Chain of Responsibility)模式
- 状态(State)模式
- 观察者(Observer)模式
- 中介者(Mediator)模式
- 迭代器(Iterator)模式
- 访问者(Visitor)模式
- 备忘录(Memento)模式
- 解释器(Interpreter)模式
- 设计模式详解
- 单例模式
- 定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式
- 特点
- 单例类只有一个实例对象
- 该单例对象必须由单例类自行创建
- 单例类对外提供一个访问该单例的全局访问点
- 优点
- 单例模式可以保证内存里只有一个实例,减少了内存的开销
- 可以避免对资源的多重占用
- 单例模式设置全局访问点,可以优化和共享资源的访问
- 缺点
- 单例模式一般没有接口,扩展困难
- 在并发测试中,单例模式不利于代码调试
- 单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则
- 结构
- 单例类:包含一个实例且能自行创建这个实例的类。
- 访问类:使用单例的类
- 实现
- 懒汉式单例:在调用功能时才创建对象 ->线程不安全|不同步的
- 饿汉式单例:在类加载完成之后就创建对象->线程安全的|同步的
- 简单工厂模式
- 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中
- 在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple FactoryPattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。
- 优点
- 工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例
- 客户端无需知道所创建具体产品的类名,只需知道参数即可。
- 也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类
- 缺点
- 1. 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响
- 2. 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
- 3. 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
- 4. 简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构
- 结构
- 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑
- 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口
- 具体产品(ConcreteProduct):是简单工厂模式的创建目标
- 实现
- 工厂方法模式
- 优点
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则
- 缺点
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度
- 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决
- 结构
- 抽象工厂(Abstract Factory):提供了创建产品的接口
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应
- 优点
- 单例模式
- 创建类
Java中的设计模式
最新推荐文章于 2024-08-23 16:46:10 发布