【设计模式】工厂模式 C++ 创建型模式

简单工厂模式

简单工厂模式其实不难理解,我们有一间食品工厂,工厂的流水线用来生产各种口味的薯片。根据市场的要求,流水线需要随时切换生产的口味。

那么问题来了。假设不使用任何设计模式,那么我们应该怎么做?

假设不使用任何设计模式,那么我们是不是应该将各种口味的薯片各自封装成一个函数,然后根据不同的需求调用不同的函数?要调用不同的函数,那么我们必须要知道代表口味的函数名称。如果有成百上千中口味呢?

所有,简单工厂就我个人的理解来说,就是用来统一接口的。

它有两个主要的类,一个是产品类,这是一个接口类;二是一个工厂类,用来创建相应的对象。同时,还有许许多多的具体产品类,它们继承产品类,重载产品类的方法,在工厂类中根据需要生产实例。

#include<iostream>
using namespace std;
/* 产品类 */
class AbstractProduct{
	public:
		virtual void GetName() = 0;
};

/* 具体产品类A */
class ProductA:public AbstractProduct{
	public:
		void GetName(){
			cout << "This is ProductA" << endl;
		}
};

/* 具体产品类B */
class ProductB:public AbstractProduct{
	public:
		void GetName(){
			cout << "This is ProductB" << endl;
		}
};

/* 工厂类 */
class Factory{
	public:
		AbstractProduct* GetProduct(int type){
			AbstractProduct *product;
            /* 通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。 */
			switch(type){
				case 1:product = new ProductA();break;
				case 2:product = new ProductB();break;
				default:product = NULL;break;
			}
			return product;
		}
};

int main(){
	Factory *factory = new Factory();
	AbstractProduct *product = factory->GetProduct(2);
	product->GetName(); 
	return 0;
}

工厂方法模式

工厂方法模式跟简单工厂模式的区别主要是:一个工厂方法类生成许多具体工厂类,每个具体工厂类只生产一个 具体产品

#include<iostream>
using namespace std;

 class AbstractProduct{
 	public:
 		virtual void GetName() = 0;
 };
 
 class AbstractFactory{
 	public:
		virtual AbstractProduct* GetProduct() = 0; 
 }; 
 
 class ProductA : public AbstractProduct{
 	public:
 		void GetName(){
 			cout << "This is ProductA" << endl;
		 }
 };

 class ProductB : public AbstractProduct{
 	public:
 		void GetName(){
 			cout << "This is ProductB" << endl;
		 }
 };
 
 class FactoryA : public AbstractFactory{
 	public:
 		AbstractProduct* GetProduct(){
 			return new ProductA();
		 }
 };
 
  class FactoryB : public AbstractFactory{
 	public:
 		AbstractProduct* GetProduct(){
 			return new ProductB();
		 }
 };
 
 int main(){
 	AbstractFactory *factory = new FactoryA();
 	AbstractProduct *product = factory->GetProduct();
 	product->GetName();
 	
 	FactoryB *factory_b = new FactoryB();
 	factory_b->GetProduct()->GetName();
 	return 0;
 }
 

抽象工厂模式

抽象工厂模式跟工厂方法模式类似,从代码上而言,区别在于抽象类中接口的个数。

#include<iostream>
using namespace std;

 class AbstractProduct{
 	public:
 		virtual void GetName() = 0;
 };
 
 class AbstractFactory{
 	public:
		virtual AbstractProduct* GetProduct() = 0; 
 }; 
 
 class ProductA : public AbstractProduct{
 	public:
 		void GetName(){
 			cout << "This is ProductA" << endl;
		 }
 };

 class ProductB : public AbstractProduct{
 	public:
 		void GetName(){
 			cout << "This is ProductB" << endl;
		 }
 };
 
 class FactoryA : public AbstractFactory{
 	public:
 		AbstractProduct* GetProduct(){
 			return new ProductA();
		 }
 };
 
  class FactoryB : public AbstractFactory{
 	public:
 		AbstractProduct* GetProduct(){
 			return new ProductB();
		 }
 };
 
 int main(){
 	AbstractFactory *factory = new FactoryA();
 	AbstractProduct *product = factory->GetProduct();
 	product->GetName();
 	
 	FactoryB *factory_b = new FactoryB();
 	factory_b->GetProduct()->GetName();
 	return 0;
 }
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值