什么是设计模式?
设计模式(Design pattern)是一套被反复使用、多数人知晓的、是代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式的目标之一就是提高程序的可复用性。考虑的是怎样才能将程序作为“组件”复用。
设计模式的六大原则是什么?
开闭原则(Open Close Principle):对扩展开放,对修改关闭
里氏替换原则(Liskov Substitution Principle):子类可以扩展父类的功能,但不能改变父类原有的功能
依赖倒转原则(Dependence Inversion Principle):高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象,核心思想是面向接口编程
接口隔离原则(Interface Segregation Principle):客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
迪米特法则(最少知道原则)(Demeter Principle):一个对象应该对其他对象保持最少的了解
单一职责原则( Single responsibility principle ):不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
设计模式的分类?
创建型设计模式:
对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。
工厂方法模式(Factory Method)
抽象工厂模式(Abstract Factory)
创建者模式(Builder)
原型模式(Prototype)
单例模式(Singleton)
结构型模式:
描述如何将类或者对 象结合在一起形成更大的结构,就像搭积木,可以通过 简单积木的组合形成复杂的、功能更为强大的结构。
外观模式/门面模式(Facade门面模式)
适配器模式(Adapter)
代理模式(Proxy)
装饰模式(Decorator)
桥梁模式/桥接模式(Bridge)
组合模式(Composite)
享元模式(Flyweight)
行为型设计模式:
是对在不同的对象之间划分责任和算法的抽象化。
行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用
模板方法模式(Template Method)
观察者模式(Observer)
状态模式(State)
策略模式(Strategy)
职责链模式(Chain of Responsibility)
命令模式(Command)
访问者模式(Visitor)
调停者模式(Mediator)
备忘录模式(Memento)
迭代器模式(Iterator)
解释器模式(Interpreter)
什么是单例模式?
单例模式:是一种常用的软件设计模式,在它的核心结构中值包含一个被称为单例的特殊类。一个类只有一个实例,即一个类只有一个对象实例。将默认的构造函数声明为私有的。
单例模式可以分为懒汉式和饿汉式:
懒汉式单例模式:在类加载时不初始化。在instance中new instance然后返回。
饿汉式单例模式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。在静态区初始化instance,然后通过instance返回。
懒汉式单线程不安全:在类加载时不初始化
class Singleton
{
public:
static Singleton* instance()
{
if(_instance==NULL)
{
_instance=new Singleton;()
}
return _instance;
}
private:
Singleton()
{
cout<<"Singleton..."<<endl;
}
static Singleton* _instance=NULL;
Singleton(const Singleton& src);
Singleton operator=(const Singleton& src);
}
饿汉模式 单线程安全:在类加载时已经初始化
Singleton* Singleton::instance ()
{
return _instance;
}
Singleton::Singleton()
{
cout<<Singleton...<<endl;
}
Singleton* Singleton::_instance=new Singleton();
懒汉模式 多线程中加锁:
Singleton::Singleton()
{
cout<<Singleton...<<endl;
}
Singleton* Singleton::_instance=NULL;
Singleton* Singleton::instance ()
{
lock();
if(_instance==NULL)
{
_instance=new Singleton();
}
unlock();
return instance;
}
懒汉模式 双重锁定:为解决加锁每次判断是否为空都需要被锁定,很多线程,就会造成大量线程的阻塞。
Singleton::Singleton()
{
cout<<Singleton...<<endl;
}
Singleton* Singleton::_instance=NULL;
Singleton* Singleton::instance ()
{
if(_instance==NULL)
{
lock();
if(_instance==NULL)
{
_instance=new Singleton();
}
unlock();
}
return instance;
}
优点:
1.减少了时间和空间的开销
2.提高了封装性,使得外部不易改动实例
缺点
1.懒汉式是以时间换空间的方式。
2.饿汉式是以空间换时间的方式。