前言
记录记录我理解的设计模式
设计模式主要分为三大类:
创建型设计模式:对象的创建问题,封装复杂的创建问题。
结构型设计模式:类或对象组合在一起的问题,应用于一些特定的场景。
行为型设计模式:类和对象的交互问题。
目前只理解了 创建型设计模式中的单例模式和工厂模式;结构型设计模式的装饰模式;行为型设计模式的观察者模式。
一、创建型设计模式
1.单例模式
类的实例化只能有一个,并提供一个访问它的全局访问点。如 文件系统、打印程序等。
通常都是通过全局或者静态变量来实现,其构造函数、拷贝构造函数和赋值构造函数都必须设为private私有的,不允许类外直接调用构造函数,而是类提供一个静态函数来内部调用构造函数来创建实例。
根据创建的时间点又分为懒汉模式和饿汉模式:
①懒汉模式:用的时候才实例化,其存在着不安全隐患,如多个线程同时创建,①必须把这个实例化过程视为临界区的资源,需要加锁②或者使用静态变量来避免重复定义,否则会有问题。
②饿汉模式:在初始化的时候在立马创建,不管后续用不用,所以饿汉模式是安全的,
2.工厂模式
工厂模式用来创建不同但是相关类型的对象,不同情况使用不同功能,工厂模式又分为简单工厂、工厂方法和抽象工厂。
①简单工厂:其工厂还没有被抽象为类,还只是一个函数接口,通过形式参数和内部结构来创建不同的对象。
理解图:
工厂还是一个函数,通过传入的参数,决定创建哪个类型的对象。 比较简单,但是要添加新的产品的时候,需要修改工厂的代码。
②工厂方法:把工厂也抽象为类,使工厂本身也多态,而不是一个接口(抽象出工厂类)。不满足开闭原则。
理解图:
工厂也抽象为了类,要添加新产品,只需要添加相应的继承类即可,不需要对函数进行修改了,满足开闭原则。
③抽象工厂
与工厂方法类似,工厂方法是抽象工厂的一个特例(只有一个产品),多个产品时,使用抽象工厂。
理解图:
相比于工厂方法,工厂抽象还要复杂一点,工厂方法对应于单个产品,工厂抽象对应于多个产品。
二、结构型设计模式
1.装饰模式
可以动态的添加新功能,比派生类更灵活。
因为他们都具有同样的基类(自动步枪),所以可以直接调用初始化。
是这么使用的。
自动步枪* myqiang = new 自动步枪();
AK47* myAK = new AK47(myqiang);
印花* myAK_yinhua = new 印花(myAK);
扩容弹夹* myAK_yinhua_kuorongdanjia = new 扩容弹夹(myAK_yinhua);
myqiang = myAK_yinhua_kuorongdanjia;
myqiang->fire();
精髓就是装饰的具体类调用Decorator装饰的抽象类的构造函数。
装饰的抽象类必须有一个指针变量指向ConcreteComponent具体的被修饰对象。
它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象。用户适当调用就调用即可。
三、行为型设计模式
1.观察者模式
定义一种一(被观察者)对多(观察者)的关系,一旦被观察者变化,会通知所有的观察者都做出相应的行动。(发布\订阅模式)
理解图:
被观察者类内部需要有一个数据结构可以存储所有的观察者(观察者的指针)、并且被观察者类内部至少需要有几个函数:增加观察者、删除观察者和通知观察者。
观察者类内部有针对不同通知的操作即可。
后面慢慢学吧。。路漫漫其修远兮!