设计模式

本文深入探讨了单例模式、工厂模式、装饰器模式、订阅/发布模式、观察者模式和MVC模式,解析每种模式的核心概念、应用场景及其实现方式。

目录

一、单例模式

二、工厂模式

三、装饰器模式

四、订阅/发布模式

五、观察者模式

六、MVC模式


一、单例模式

  1. 在它的核心结构中包含一个被称为单例的特殊类,一个类只有一个实例,即一个类只有一个对象实例;
  2. 所有的单例模式都是使用静态方法进行创建的,所以单例对象在内存中静态共享区中存储;
  3. 单例模式分为饿汉式和懒汉式懒汉式单例模式在类加载时不初始化饿汉式单例模式,在类加载时就完成初始化,所以类加载较慢,但获取对象速度快。

手写线程安全的单例模式:

线程安全的懒汉实现

线程不安全,怎么办呢?最直观的方法:加锁。

  • 方法1:加锁的经典懒汉实现:

class singleton
{
protected:
    singleton()
    {
        pthread_mutex_init(&mutex);
    }
private:
    static singleton* p;
public:
    static pthread_mutex_t mutex;
    static singleton* initance();
};

pthread_mutex_t singleton::mutex;
singleton* singleton::p = NULL;
singleton* singleton::initance()
{
    if (p == NULL)
    {
        pthread_mutex_lock(&mutex);
        if (p == NULL)
            p = new singleton();
        pthread_mutex_unlock(&mutex);
    }
    return p;
}
  • 方法2:内部静态变量的懒汉实现

  此方法也很容易实现,在instance函数里定义一个静态的实例,也可以保证拥有唯一实例,在返回时只需要返回其指针就可以了。推荐这种实现方法,真得非常简单。    

class singleton
{
protected:
    singleton()
    {
        pthread_mutex_init(&mutex);
    }
public:
    static pthread_mutex_t mutex;
    static singleton* initance();
    int a;
};

pthread_mutex_t singleton::mutex;
singleton* singleton::initance()
{
    pthread_mutex_lock(&mutex);
    static singleton obj;
    pthread_mutex_unlock(&mutex);
    return &obj;
}

饿汉实现

饿汉实现本来就是线程安全的,不用加锁。因为对象在使用前就已经创建出来了。

class singleton
{
protected:
    singleton()
    {}
private:
    static singleton* p;
public:
    static singleton* initance();
};
singleton* singleton::p = new singleton;
singleton* singleton::initance()
{
    return p;
}

以空间换时间,很简单。面试的时候,线程安全的单例模式怎么写?肯定怎么简单怎么写呀!饿汉模式反而最懒


二、工厂模式

  1. 工厂模式,简单工厂模式是由一个工厂对象根据收到的消息决定要创建哪一个类的对象实例。需要 switch 或 if 进行类型选择;工厂类创建的对象比较少,客户只需要传入工厂类参数,对于如何创建对象不关心;
  2. 工厂方法模式,定义一个创建对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。创建对象的接口,让子类决定具体实例化的对象,把简单的内部逻辑判断移动到客户端。
  3. 抽象工厂模式抽象工厂是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

三、装饰器模式

  1. 动态地给一个对象增加一些额外的职责。在为对象增加额外职责方面,装饰模式替代了继承,它比子类继承父类更为灵活,它用无需定义子类的方式来给对象动态的增加职责,使用对象之间的关联关系来取代继承, 同时避免类型体系的快速膨胀。
  2. 装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。
  3. 装饰器的价值在于装饰,他并不影响被装饰类本身的核心功能。在一个继承的体系中,子类通常是互斥的。

四、订阅/发布模式

  1. 订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有的订阅者,使它们能够自动更新自己的状态;
  2. 发布者向某个信道发布一条消息,订阅者绑定这个信道,当有消息发布至信道时就会接受到一个通知。

五、观察者模式

  1. 在对象之间定义一个一对多的依赖关系,这样一来,当一个对象改变状态,依赖他的对象会收到通知自动更新;
  2. 抽象被观察对象,抽象观察对象,具体被观察者对象,具体观察者对象;
  3. 微信公众号是一个典型的例子,有一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息;
  4. 一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。

六、MVC模式

  1. MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。
  2. 使用MVC的目的:在于将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
  3. 用户首先在界面中进行人机交互,然后请求发送到控制器,控制器根据请求类型和请求的指令发送到相应的模型,模型可以与数据库进行交互,进行增删改查操作,完成之后,根据业务的逻辑选择相应的视图进行显示,此时用户获得此次交互的反馈信息,用户可以进行下一步交互,如此循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值