简单几句话即可理解设计模式(更新ing)

本文介绍了简单工厂模式、策略模式、装饰者模式等多种设计模式,并详细解释了每种模式的原理和应用场景,帮助读者理解如何更好地组织代码。

目录

简单工厂模式

策略模式

装饰者模式

代理模式

工厂方法模式

原型模式 

模板方法模式

外观模式 

建造者模式 


在了解设计模式前我们需要了解的面向对象程序设计的一些原则

  • 设计原则
    • 单一职责原则
      • 就一个类而言,应该仅有一个引起它变化的原因;
    • 开放-封闭原则
      • 软件实体(类、模块、函数等)应该可以扩展,但是不可修改;面对需求,对程序的改动最好是通过增加新代码进行的,而不是更改现有的代码;
    • 依赖倒转原则
      • 抽象不应该依赖细节,细节应该依赖抽象;
      • 高层模块不应该依赖低层模块;两个都应该依赖抽象;
  • 迪米特法则(最小知识原则)
    • 如果两个类不必彼此直接通信,那么两个类就不应当发生直接的相互作用;如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用;强调了类之间的松耦合,类之间的耦合越低,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及;(个人感觉在定义一些工具类的时候能体现该原则)

简单工厂模式

  • 由于面向对象是为了实现三大特性:继承、封装、多态;而这个执行后会带来一个后果,就是由于继承扩展功能的类越来越多,而我们在编写代码的时候需要根据条件判断使用哪个类的时候就显得十分麻烦,因为我们需要去记住每个类名及所对应的功能;而简单工厂模式就是为了解决这一痛处:我们可以根据每个类的特点,由一个类工厂根据特点在底层自动给我们创建这个类,这样的话我们就可以利用多态自动获取我们所需要的对象;

策略模式

  • 它定义了算法家族(一系列的算法的方法),分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户,最后可以以相同的方式调用所有的算法,减少算法与使用算法之间的耦合;
  • 个人理解为多态的泛化,可以把同一类的方法或策略归纳起来,通过统一的context上下文类进行调用不同的策略,从而摆脱声明类和实际类耦合,不用通过大量的if-else进行判断创建;

装饰者模式

  • 装饰模式是为已有功能动态地添加更多功能的一种方式;当系统需要新功能的时候,我们以往会向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或主要行为;但是新加入的代码会增加主类的复杂性,显得代码十分臃肿且不好维护;而如果我们新加入的代码仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要的时候,这时候装饰模式就可以很好的解决问题,它可以把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象(就是作为属性),从而在执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象;有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑;

代理模式

  • 为其他对象提供一种代理以控制对这个对象的访问;通过根据被代理类抽象出公共接口,动态的创建一个代理类同时实现该接口,且在代理类中保存对被代理类的引用;这样当通过代理类的对象调用某个方法时就能动态地去调用被代理类中的同名方法;
  • 代理模式的应用
    • 远程代理
      • 为一个对象在不同的地址时空提供局部代表;
    • 虚拟代理
      • 浏览器通过虚拟代理来优化浏览;
    • 安全代理
      • 用来控制真实对象访问时的权限;
    • 智能指引
      • 当调用真实对象时,代理会同时去补充处理另一些事;

工厂方法模式

  • 简单工厂模式对于工厂方法模式来说最大的优点在于简单工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖;
  • 工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类;工厂方法使一个类的实例化延迟到其子类,在客户端根据不同子类调用不同方法;工厂方法模式是简单工厂模式的进一步抽象和推广;
  • 如果需要增加功能的话,简单工厂需要修改工厂类内部的判断逻辑,而工厂方法需要在客户端进行功能子类替换;

原型模式 

  • 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象;从一个对象再创建到另外一个可定制的对象,而且不需要知道任何创建的细节;
  • 浅复制vs深复制
    • 浅复制情况下,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象;
    • 深复制在浅复制基础上对被复制对象里的引用属性进一步封装拷贝,在外拷贝方法里进行内引用拷贝;

模板方法模式

  • 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,将抽象父类中的不同实现的某些点提取出来封装为抽象方法,用不同的子类分别去实现这些点从而达到很好的代码复用作用;

外观模式 

  • 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子类更加容易使用;外观类需要了解所有的子系统的方法或属性,进行组合从而被外界调用;

建造者模式 

  • 将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示;这些复杂对象内部构建间的建造顺序通常是稳定的,如同流水线般,但各个部分具体实现面临着复杂变化,因此建造者模式可以既保证对象该构建的部分不出错不缺少,又可以实现构造的对象实现多样化;

 

<think>首先,用户的问题是:“我想了解常用的几种设计模式 请问常用的设计模式有哪些”。这似乎是关于设计模式的概述。 根据系统指令,我需要: - 所有行内数学表达式使用 `$...$` 格式。 - 独立公式使用 `$$...$$` 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如:[^1]。 参考提供的引用: - 引用[1]:提到创新型设计模式简单工厂、抽象工厂、单例模式),行为型(模板设计模式、观察者模式、命令模式),结构性(适配器设计模式、代理模式、装饰器设计模式)。 - 引用[2]:详细列出了单例模式、工厂方法模式、代理模式、装饰者模式、观察者模式、责任链模式、策略模式等,并讨论了组合使用。 - 引用[3]:提到MVC模式中使用的设计模式如Observer、Composite、Strategy。 - 引用[4]:提供了单例模式的代码示例。 - 引用[5]:提供了工厂方法模式的代码示例。 用户的需求是了解常用的几种设计模式,所以我应该概述一些最常用的设计模式,基于引用。 结构化回答: - 由于用户要求“回答结构清晰,帮助用户逐步解决问题”,我应该逐步介绍设计模式。 - 从引用中,常见的设计模式包括:单例模式、工厂模式(简单工厂、抽象工厂)、代理模式、装饰者模式、观察者模式、策略模式等。 - 我可以按类别组织:创新型、行为型、结构性,但引用[1]已经这样分类了。 关键点: - 创新型:单例模式、工厂模式。 - 行为型:模板方法、观察者模式、命令模式。 - 结构性:适配器、代理、装饰器。 在回答中,我需要自然地引用来源。例如,在描述某个模式时,如果信息来自引用,就在末尾添加[^n]。 最后,生成相关问题。 回答大纲: 1. **介绍设计模式**:简要解释设计模式是什么。 2. **常用设计模式列表**:列出几种常见的,简要描述。 - 基于引用,包括:单例模式、工厂模式(简单工厂、抽象工厂)、代理模式、装饰者模式、观察者模式、策略模式。 - 每个模式一句话描述。 3. **示例或代码**:如果需要,添加简单代码示例,但保持简洁。 4. **生成相关问题**:在最后添加“相关问题”部分。 确保使用中文。 生成相关问题:基于用户问题,相关问题可能包括: - 如何实现单例模式? - 工厂模式和抽象工厂模式的区别是什么? - 设计模式在实际项目中的应用案例? - 等等。 现在,构建回答。</think>### 常用设计模式概述 设计模式是软件开发中解决常见问题的可重用解决方案,它们能提高代码的可维护性、扩展性和灵活性。根据设计模式的分类(创新型、行为型和结构性),我参考了站内引用资料,为您整理几种最常用的设计模式及其核心描述。设计模式通常分为三类: - **创新型模式**:处理对象创建机制,确保对象创建灵活且解耦。 - **行为型模式**:管理对象间的通信和职责分配。 - **结构性模式**:关注对象组合和类之间的关系。 下面列出几种最常用的设计模式,每个模式都附有简要说明和典型应用场景。这些信息基于可靠的软件开发实践[^1][^2][^5]。 #### 1. 单例模式(创新型) - **描述**:确保一个类只有一个实例,并提供全局访问点。常用于资源管理(如数据库连接池或配置管理器)。 - **示例**:分为懒汉式(延迟加载)和饿汉式(立即加载)。例如,在引用[4]中提供的代码片段展示了基本实现: ```java // 饿汉式单例 public class Singleton { public static Singleton instance = new Singleton(); private Singleton() {} // 私有构造函数 public static Singleton getInstance() { return instance; } } ``` 这种方式确保线程安全且高效[^4]。 #### 2. 工厂模式(创新型) - **描述**:通过工厂类创建对象,而不是直接使用 `new` 关键字,实现创建逻辑与业务代码解耦。包括: - **简单工厂模式**:一个工厂类根据参数创建不同产品对象。 - **工厂方法模式**:每个产品对应一个工厂子类,扩展性强。 - **抽象工厂模式**:创建相关产品族(如不同操作系统的UI组件)。 - **示例**:引用[5]中展示了工厂方法模式的核心逻辑: ```java interface Product { void make(); } class ProductA implements Product { void make() { System.out.println("ProductA ing~~~"); } } interface Factory { Product createProduct(); } class FactoryA extends Factory { Product createProduct() { return new ProductA(); } } ``` 这简化了对象创建过程,适用于需要灵活添加新产品的场景[^5]。 #### 3. 代理模式(结构性) - **描述**:为其他对象提供代理以控制访问,常用于方法增强(如日志记录、权限检查)。分为静态代理和动态代理(如Java的`Proxy`类)。 - **应用**:在Spring框架的AOP编程中广泛使用,用于横切关注点处理[^1]。 #### 4. 装饰者模式(结构性) - **描述**:动态地为对象添加新功能,而无需修改原有类。通过包装(wrapper)实现,扩展性强。 - **示例**:常用于Java I/O流(如`BufferedReader`包装`FileReader`),提供缓存功能而不改变文件读取的核心逻辑[^2]。 #### 5. 观察者模式(行为型) - **描述**:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖对象自动更新。常用于事件驱动系统(如GUI事件处理)。 - **应用**:在MVC模式中,观察者模式用于View和Model的通信,确保UI响应数据变化[^3]。 #### 6. 策略模式(行为型) - **描述**:定义一系列算法,并将每个算法封装起来,使它们可互换。客户端根据上下文选择算法。 - **示例**:如支付系统中,不同支付方式(微信、支付宝)作为策略类,通过工厂模式管理,避免`if-else`分支判断[^2]。 这些设计模式在实际开发中常组合使用,例如策略模式+工厂模式处理业务规则变更,或单例模式+观察者模式实现全局事件总线[^2]。设计模式的选择取决于具体需求:创新型模式优化对象创建,行为型模式简化交互,结构性模式增强灵活性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值