美文网首页
C++设计模式

C++设计模式

作者: Lee_Lemon | 来源:发表于2019-03-29 22:24 被阅读0次

https://www.cnblogs.com/chengjundu/p/8473564.html

单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已存在单例,如果有则返回,没有则创建。
关键代码:构造函数是私有的。

单例的实现主要有两种:懒汉式和饿汉式
懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,所以上边的经典方法被归为懒汉实现;
饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。
特点与选择:
由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。
在访问量较小时,采用懒汉实现。这是以时间换空间。

饿汉式:线程安全,注意delete
class Singleton
{
public:
    static Singleton* getInstance();
private:
     Singleton(){}
     Singleton(const Singleton&) = delete;  //明确拒绝
    Singleton& operator=(const Singleton&) = delete; //明确拒绝

    static Singleton* m_pSingleton;
 };

 Singleton* Singleton::m_pSingleton = new Singleton();

 Singleton* Singleton::getInstance()
{
    return m_pSingleton;
}

懒汉式:加lock,线程安全
std::mutex mt;
class Singleton
{
public:
    static Singleton* getInstance();
private:
    Singleton(){}
    Singleton(const Singleton&) = delete;  //明确拒绝
    Singleton& operator=(const Singleton&) = delete; //明确拒绝

    static Singleton* m_pSingleton;

};
Singleton* Singleton::m_pSingleton = NULL;

Singleton* Singleton::getInstance()
{
    if(m_pSingleton == NULL)
    {
        mt.lock();
        m_pSingleton = new Singleton();
        mt.unlock();
    }
    return m_pSingleton;
}
 //END

工厂模式

工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式
1)、简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。
2)、工厂方法模式:是指定义一个创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
缺点:每增加一种产品,就需要增加一个对象工厂。相比简单工厂模式,工厂方法模式需要定义更多的类。
3)、抽象工厂模式:提供一个创建一系列相关或相互依赖的对象接口,而无需指定它们的具体类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

适配器模式

适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。
主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
如何解决:继承或依赖(推荐)。
关键代码:适配器继承或依赖已有的对象,实现想要的目标接口。
缺点:1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

代理模式

代理模式:为其它对象提供一种代理以控制对这个对象的访问。
主要解决:在直接访问对象时带来的问题,比如:要访问的对象在远程服务器上。在面向对象系统中,有些对象由于某些原因,直接访问会给使用者或系统带来很多麻烦,可以在访问此对象时加上一个对此对象的访问层。
如何解决:增加中间代理层。
关键代码:实现与被代理类组合。

策略模式

策略模式:是指定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。使得算法可以独立于使用它的客户而变化,也就是说这些算法所完成的功能是一样的,对外接口是一样的,只是各自现实上存在差异。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

相关文章

  • C++常用设计模式

    C++常用设计模式。

  • C++ 中的设计模式

    对于任何一种语言都有自己的设计模式,C++也不例外,详情请见:C++ 中的各种设计模式

  • Boolan - C++学习笔记 _设计模式 - 第 一 周

    C++设计模式主要内容: 什么是设计模式: 设计模式遵循的一般原则:1.开-闭原则(Open-Closed Pri...

  • C++设计模式-第一篇 (Boolan)

    C++设计模式-第一篇 (Boolan) 本章内容:1 面向对象设计原则2 GOF-23种设计模式分类3 模板方法...

  • Boolan_C++设计模式_第一周笔记

    本周课程主要内容为:C++设计模式简介、面向对象设计八大原则和DOF-23设计模式中的5中模式,包括templat...

  • GeekBand C++ Week9 Notes

    C++设计模式 为了理解松耦合设计思想,掌握面向对象设计原则 什么是设计模式? 是一种解决方案的核心,可以避免重复...

  • monolake 的GeekBand C++开发学习笔记(十)

    前记:进入C++设计模式第二周,本周学习了构造类模式和接口隔离类模式。 创建型模式:前面说了设计模式的一个核心的原...

  • 2018-03-22

    Boolan C++设计模式二 “对象创建”模式:通过“对象创建”模式绕开new,来避免对象创建(new)过程中所...

  • 实现:使用c++模拟,实现GOF的23种设计模式。 设计模式在面向对象系统的设计和开发中的作用和数据结构对于面向过...

  • C++设计模式第一周学习笔记——Boolan

    C++设计模式是本周开始的一门全新的课程,在完成了第一周的学习之后,对C++设计模式有了一定的认识和了解,因此有一...

网友评论

      本文标题:C++设计模式

      本文链接:https://www.haomeiwen.com/subject/mgwdvqtx.html