1.单例模式作用:保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例 。
应用:常用于管理资源,如日志、线程池
实现要点:
在类中,要构造一个实例,就必须调用类的构造函数,并且为了保证全局只有一个实例,
需防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为private,
同时阻止拷贝创建对象时赋值时拷贝对象,因此也将它们声明并权限标记为private;
另外,需要提供一个全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例 。
class Singleton{public:static Singleton& getInstance(){static Singleton instance;return instance;}void printTest(){cout<<"do something"<<endl;}private:Singleton(){}//防止外部调用构造创建对象Singleton(Singleton const &singleton);//阻止拷贝创建对象Singleton& operator=(Singleton const &singleton);//阻止赋值对象};int main(){Singleton &a=Singleton::getInstance();a.printTest();return 0;}
首先,构造函数声明成private的目的是只允许内部调用,getInstance()中的静态局部变量创建时调用,但不允许外部调用构造创建第二个实例;
然后,拷贝构造和拷贝赋值符是声明成了private而不给出定义,其目的是阻止拷贝,如果企图通过拷贝构造来创建第二个实例,编译器会报错 。
阻止拷贝的另一种写法是声明后接一个"=delete",也能起到相同的作用(C++11) 。
2.工厂模式工厂模式包括三种:简单工厂模式、工厂方法模式、抽象工厂模式 。
工厂模式的主要作用是封装对象的创建,分离对象的创建和操作过程,用于批量管理对象的创建过程,便于程序的维护和扩展 。
(1)简单工厂模式
简单工厂是工厂模式最简单的一种实现,对于不同产品的创建定义一个工厂类,将产品的类型作为参数传入到工厂的创建函数,根据类型分支选择不同的产品构造函数 。
//简单工厂模式typedef enum ProductTypeTag{TypeA,TypeB,TypeC}PRODUCTTYPE;class Product//产品抽象基类{public:virtual void Show() = 0;};class ProductA : public Product{public:void Show(){cout<<"I'm ProductA"<<endl;}};class ProductB : public Product{public:void Show(){cout<<"I'm ProductB"<<endl;}};class ProductC : public Product{public:void Show(){cout<<"I'm ProductC"<<endl;}};class Factory//工厂类{public:Product* CreateProduct(PRODUCTTYPE type){switch (type){case TypeA:return new ProductA();case TypeB:return new ProductB();case TypeC:return new ProductC();default:return NULL;}}};int main(){Factory productCreator;Product *productA=productCreator.CreateProduct(TypeA);Product *productB=productCreator.CreateProduct(TypeB);Product *productC=productCreator.CreateProduct(TypeC);productA->Show();productB->Show();productC->Show();if(productA){delete productA;productA=NULL;}if(productB){delete productB;productB=NULL;}if(productC){delete productC;productC=NULL;}return 0;}
(2)工厂方法模式
其实这才是正宗的工厂模式,简单工厂模式只是一个简单的对创建过程封装 。工厂方法模式在简单工厂模式的基础上增加对工厂的基类抽象,不同的产品创建采用不同的工厂创建(从工厂的抽象基类派生),这样创建不同的产品过程就由不同的工厂分工解决:FactoryA专心负责生产ProductA,FactoryB专心负责生产ProductB,FactoryA和FactoryB之间没有关系;如果到了后期,如果需要生产ProductC时,我们则可以创建一个FactoryC工厂类,该类专心负责生产ProductC类产品 。
该模式相对于简单工厂模式的优势在于:便于后期产品种类的扩展 。
//工厂方法模式typedef enum ProductTypeTag{TypeA,TypeB,TypeC}PRODUCTTYPE;class Product//产品抽象基类{public:virtual void Show() = 0;};class ProductA : public Product{public:void Show(){cout<<"I'm ProductA"<<endl;}};class ProductB : public Product{public:void Show(){cout<<"I'm ProductB"<<endl;}};class Factory//工厂类{public:virtual Product *createProduct()=0;};class FactoryA:public Factory{public:Product *createProduct(){return new ProductA();}};class FactoryB:public Factory{public:Product *createProduct(){return new ProductB();}};class FactoryC:public Factory{public:Product *createProduct(){return new ProductC();}};int main(){Factory *factoryA=new FactoryA();Product *productA = factoryA->createProduct();productA->Show();Factory *factoryB=new FactoryB();Product *productB = factoryB->createProduct();productB->Show();if (factoryA){delete factoryA;factoryA = NULL;}if (factoryB){delete factoryB;factoryB = NULL;}if (productA){delete productA;productA = NULL;}if (productB){delete productB;productB = NULL;}return 0;}
推荐阅读
- 分布式系统全局唯一ID的几种实现方式
- 空军|钓鱼遇到以下几种怪事,这是有征兆的吗?
- 盘点可安装插件的路由器,实用还是噱头?
- 服中药的几种禁忌
- 装修风水禁忌大盘点
- 采集Nginx日志的几种方式
- Mysql中你知道几种防止数据重复的方法?
- 绿茶加茉莉有什么功效,康师傅茉莉茶有几种
- 鸡蛋|氛围感妆容要怎么打造,学会这几种方式,气质瞬间上升
- Windows驱动锁的C++简单封装