设计模式的重要性就不用多说了。各种设计模式在实际项目中用的是比比皆是。
一:简单工厂模式和工厂模式
懂得一点UML,一看这幅类图,就知道工厂模式是用来干嘛的,说白了,就是提供一个抽象的基类接口,使得用户不用记住具体的要成成的新的类的名字。
下面 看一段代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Product
{
public:
Product(){}
~Product(){};
};
class ProductA:public Product
{
public:
ProductA(){cout<<"ProductA"<<endl;}
~ProductA(){}
};
class Factory
{
public:
Factory(){}
~Factory(){}
ProductA* createProductA()
{
return new ProductA();
}
};
int main()
{
Factory f;//简单工厂模式
ProductA* pa=f.createProductA();
system("pause");
return 0;
}
这里只列举了一个产品,可以自行扩展多个产品,比如产品都有:香蕉、苹果、橘子等等。指需要通知一声工厂,工厂就会调用相应的 生产香蕉、生产苹果、生产橘子等函数、而客户不需要知道生产这些水果的具体过程。坐着等吃就行。
工厂模式的类图如下,具体代码省。。
二 :抽象工厂模式
上面 所讲的工厂模式还不够抽象,因为只有产品抽象了,工厂并未抽象,上面所讲的是一个工厂生产了所有需要的产品,但是,你想想,假设HTC厂家生产HTC手机、HTC电池、诺基亚手机。。。你觉得很奇怪吗, 这个时候就需要抽象工厂模式来解决了,HTC应该生产HTC旗下的产品、苹果生产苹果系列的产品,这样管理起来也方便。
看看代码例子:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class AbstractPruduct
{
public:
AbstractPruduct(){}
~AbstractPruduct(){}
virtual void print()=0;
};
class ProductA:public AbstractPruduct
{
public:
ProductA(){cout<<"ProductA"<<endl;}
~ProductA(){}
void print()
{
cout<<"I'm ProductA"<<endl;
}
};
class ProductB:public AbstractPruduct
{
public:
ProductB(){cout<<"ProductB"<<endl;}
~ProductB(){}
void print()
{
cout<<"I'm ProductB"<<endl;
}
};
class AbstractFactory
{
public:
AbstractFactory(){}
~AbstractFactory(){}
};
class FactoryA:public AbstractFactory
{
public:
FactoryA(){cout<<"FactoryA"<<endl;}
~FactoryA(){}
ProductA* createProduct()
{
return new ProductA();
}
};
class FactoryB:public AbstractFactory
{
public:
FactoryB(){cout<<"FactoryB"<<endl;}
~FactoryB(){}
ProductB* createProduct()
{
return new ProductB();
}
};
int main()
{
FactoryB fa; //抽象工厂模式
AbstractPruduct* ap=fa.createProduct();
ap->print();
system("pause");
return 0;
}
实际工作中,需要配置一个XML配置文件,这样就可以与客户达到一个很好交互性,客户又不需要知道具体的逻辑实现,只需要配置文本文件,就能达到预期的效果了
三:单例模式
单例模式很常见,比如我们电脑的任务管理器就使用了单例模式。
当我们需要共享数据或需要数据同步的时候可以考虑使用单例模式。
具体代码如下:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Singleton
{
public:
~Singleton(){}
static Singleton* Instance();
private:
Singleton(){cout<<"Singleton初始化"<<endl;}
static Singleton* st;
};
Singleton* Singleton::st=NULL;
Singleton* Singleton::Instance()
{
if(st==NULL)
{
st=new Singleton();
}
return st;
}
int main()
{
Singleton *ss=Singleton::Instance();//单例模式
Singleton *sss=Singleton::Instance();//这里将用到上面的提供的指针
system("pause");
return 0;
}