常用设计模式与六原则详解

本文详细介绍了设计模式中的六大原则:单一职责、开闭原则、里氏替换原则、依赖倒置、接口隔离和迪米特法则,并探讨了它们在面向对象设计中的重要性。接着,对三种常用设计模式——单例模式、工厂模式和观察者模式进行了深入讲解,包括其实现方法、优缺点和适用场景。

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

设计模式六大原则

参考链接

1.单一职责
  • 最简单的面向对象设计原则,用于控制类的颗粒大小。
  • 一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。
  • 单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则。
2.开闭原则
  • 面向对象的可复用设计的基石,是最重要的面向对象的设计原则,也是面向对象的目标。
  • 一个软件实体应该对拓展开放,对修改关闭。软件应该在拓展的时候尽可能不去修改源代码。
  • 抽象化是开闭原则的关键,为实现开闭原则,C++提供了抽象类、多态等方法。
3.里氏替换原则
  • 所有使用基类的地方必须能够透明的使用其子类对象。
  • 一个软件将一个基类替换成子类对象,程序将不会产生任何的错误,反之则不####成立。
  • 里氏替换原则是实现开闭原则的重要方式之一。
4.依赖倒置
  • 抽象不应该依赖于细节,细节应当依赖于抽象。要针对接口编程,而不是针对于实现编程。
  • 实现依赖倒置原则,我们应该针对抽象层编程,而将通过依赖注入的方法,注入到其他对象中。一般是通过抽象来注入所依赖的对象。
5.接口隔离
  • 使用多个专门的接口,而不是使用单一的接口,客户端不应该依赖那些它不需要的接口。
  • 一个接口相当于一个单独的角色,不该干的事情不要干,该干的事情必须干。
  • 客户端应该将不需要的接口隐藏起来,如C++中的封装。不应该强迫用户使用那些他们不用的方法。
6.迪米特法则
  • 一个软件实体应该尽可能少的与其他实体发生相互作用。
  • 迪米特法则要求尽可能的降低系统的耦合度,使得类与类的之间保持松散的耦合关系。
  • 减少两个对象的直接作用,可以通过引用一个第三者来降低现有对象的耦合度。
7.总结
  • 单一职责讲的是写一个类与函数注意的点。
  • 开闭原则与里氏替换原则,要求程序应该面向对象。
  • 依赖倒住是面向对象的实现方法。
  • 接口隔离强调封装的重要性。
  • 迪米特法则要求类的设计应当尽量的松耦合,减少对象之间的交互。

常用设计模式

1.单例模式

参考链接

  • 关键点有四个
  • 1.将构造函数设置为私有。
  • 2.声明一个静态单例对象。
  • 3.构造单例对象之前需要加锁。(必须锁柱对象,而非类型)
  • 4.当前同时发生两次检测单例是否为空时,分别应该在锁之前与锁之后。(避免构造多个实例)
  • 单例模式分为懒汉式和饿汉式。懒汉式是使用的时候进行创建。饿汉式直接创建静态实体,用的时候直接返回。
    懒汉式
    在这里插入图片描述
    饿汉式
    在这里插入图片描述
2.工厂模式

参考1
参考2

  • 核心功能:根据需求生产产品。
  • 核心思想:解耦需求、工厂和产品。
  • 一般分为简单工厂、工厂和抽象工厂。

简单工厂

  • 通过switch…case判断语句等操作来解析需求,没有做到工厂与产品的解耦和。、
  • 优点:初步实现简单。
  • 简单工厂中不同的产品都在同一个工厂进行胜场,随着产品增多,会多次去修改工厂里边 的代码。无法做到开闭原则,也不满足迪米特法则。
int prodNo;
class IProduct
{
    public:
    SimpleFactroy(int proNo)
    {
        this.prodNo=prodNo;
    }
    IProduct GetProduct()
    {
        switch(prodNo)
            {
                case 1:
                    return new ProductA();
                case 2:
                    return new ProductB();
                default:
                    return new ProductC();
            }
    }
}
//产品A
class ProductA: IProduct
{
//属性   ...
}

普通工厂

  • 普通工厂将每个产品都写一个工厂,所有的产品派生于一个抽象的产品。
  • 优点:让实现方法更加的面向对象。
  • 缺点:是每增加一种产品就需要同时增加一个工厂类。当需求发生变化的时候只需要增删相应的类,不需要修改已经有的类。
interface  IFactroy  //工厂接口
{
    IProduct GetProduct();
}
//A工厂类
 class FactroyA:IFactroy
{
    IProduct productA;
    public:
        FactroyA()
        {
            this.productA=new ProductA();
        }
        IProduct GetProduct()
        {
            return this.productA;    //A工厂生产A产品
        }
}
...B同理          //B工厂生产B产品

//产品A
class ProductA: IProduct
{
//属性...
}
...其他产品

抽象工厂

  • 一个抽象工厂派生出不同的具体工厂,一个抽象产品派生不同的具体产品,每个工厂生产自己的产品族。
  • 优点:工厂和产品都是面向对象编程了。
  • 缺点:每次拓展新的产品类,需要修改所有的工厂以及抽象工厂的接口。

总结

  • 为了适应程序的扩展性,简单工厂就衍生了普通工厂、抽象工厂等模式。每种模式有每种模式的优点,需要根据实际情况来进行选择。
3.观察者模式
  • 在实际的开发中,出现一对多的依赖关系时,比如:一个守卫(观察者)看管多个囚犯。最简单的方法就是将这些对象绑定在一起,但是这样会造成程序耦合度较高。
  • 主要实现是:将被观察者对象本身传给观察者,通过遍历的方式更新被观察者的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值