设计形式之工厂模式、抽象工厂模式、单例模式(C++代码)

设计模式之工厂模式、抽象工厂模式、单例模式(C++代码)

设计模式的重要性就不用多说了。各种设计模式在实际项目中用的是比比皆是。

一:简单工厂模式和工厂模式

设计形式之工厂模式、抽象工厂模式、单例模式(C++代码)

懂得一点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;
}

这里只列举了一个产品,可以自行扩展多个产品,比如产品都有:香蕉、苹果、橘子等等。指需要通知一声工厂,工厂就会调用相应的 生产香蕉、生产苹果、生产橘子等函数、而客户不需要知道生产这些水果的具体过程。坐着等吃就行。

工厂模式的类图如下,具体代码省。。

设计形式之工厂模式、抽象工厂模式、单例模式(C++代码)

二 :抽象工厂模式

上面 所讲的工厂模式还不够抽象,因为只有产品抽象了,工厂并未抽象,上面所讲的是一个工厂生产了所有需要的产品,但是,你想想,假设HTC厂家生产HTC手机、HTC电池、诺基亚手机。。。你觉得很奇怪吗, 这个时候就需要抽象工厂模式来解决了,HTC应该生产HTC旗下的产品、苹果生产苹果系列的产品,这样管理起来也方便。

设计形式之工厂模式、抽象工厂模式、单例模式(C++代码)

看看代码例子:

#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配置文件,这样就可以与客户达到一个很好交互性,客户又不需要知道具体的逻辑实现,只需要配置文本文件,就能达到预期的效果了


三:单例模式

单例模式很常见,比如我们电脑的任务管理器就使用了单例模式。

当我们需要共享数据或需要数据同步的时候可以考虑使用单例模式。

设计形式之工厂模式、抽象工厂模式、单例模式(C++代码)

具体代码如下:

#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;
}