c++设计模式之工厂模式

前言

工厂模式是23种设计模式中用的频率比较高,同时也是较为简单的模式。工厂模式,顾名思义,是一种创建型的模式,其实现方式有三种,分别是简单工厂模式,工厂方法模式和抽象工厂方法。

简单工厂

简单工厂模式又称静态工厂方法模式,是最简单的一种工厂模式。简单工厂模式是通过传入参数给工厂对象,指定创建某一种产品实例。简单工厂模式的UML图如下:
在这里插入图片描述
接下来看一个例子,以生产电脑为例,假设有一个工厂可以生产联想和戴尔两种电脑,具体生产哪种由老板决定。具体代码如下:

#include <iostream>
using namespace std;
enum eComputer{
	lenovo,
	dell
}; 
class Computer{
	public:
		virtual void show() = 0;
}; 
class Lenovo:public Computer{
	public:
		void show()
		{
			cout << "Lenovo" << endl;
		}
};
class Dell:public Computer{
	public:
		void show()
		{
			cout << "Dell" << endl;
		}
};
class Factory{
	public:
		Computer* createproduct(eComputer type)
		{
			switch(type)
			{
				case lenovo:
					return new Lenovo;
					break;
				case dell:
					return new Dell;
					break;
				default:
					break;
			}
		}
};
int main()
{
	Factory* fp = new Factory(); //创建一个工程
	fp->createproduct(lenovo)->show();//老板说生产联想
	fp->createproduct(dell)->show();//老板说生产戴尔
	return 0;
}

程序输出结果:
在这里插入图片描述
由上例可以看出简单工厂模式的缺点很明显:如果需要增加产品,就需要修改工厂类中的代码,违反了开闭原则。

工厂方法模式

工厂模式不仅仅是提供了创建了对象的接口,更重要的是延迟了子类的实例化。核心的工厂类将会成为一个抽象类,具体的创建工作交由子类来完成,这么做的一个好处就是当需要增加产品时,不需要修改核心工厂的代码即可完成。
在该模式中,工厂和产品通常是一一对应关系。
还是由生产电脑的例子来演示工厂方法。由于工厂收入很客观,因此老板决定再做两个工厂,分别单独生产联想电脑和戴尔电脑,以后生产电脑的工作交由两个子工厂分别负责,一开始两个工厂也不知道怎么生产联想和戴尔的电脑,因此他们需要从总工厂学习(继承)生产电脑的方法。接下来看一下具体的代码。

#include <iostream>
using namespace std;
enum eComputer{
	lenovo,
	dell
}; 
class Computer{
	public:
		virtual void show() = 0;
}; 
class Lenovo:public Computer{
	public:
		void show()
		{
			cout << "Lenovo" << endl;
		}
};
class Dell:public Computer{
	public:
		void show()
		{
			cout << "Dell" << endl;
		}
};
class Factory{
	public:
		virtual Computer* create() = 0;
};

class LenovoFactory:public Factory{
	public:
		Computer* create()
		{
			return new Lenovo();
		}
};

class DellFactory:public Factory{
	public:
		Computer* create()
		{
			return new Dell();
		}
};	

int main()
{
	
	LenovoFactory* lf = new  LenovoFactory();//创建联想工厂
	DellFactory*   dl = new DellFactory();//创建戴尔工厂
	lf->create()->show();
	dl->create()->show();
	delete lf;
	delete dl;
	return 0;
}

工厂方法缺点也很明显,每增加一个产品就需要增加一个新的工厂。

抽象工厂模式

现在考虑一下假设之前生产的联想是A型号,现在又需要生产B型号的联想,需要增加新的工厂的吗?答案是不需要。做法也很简单,只需要在核心工厂中提供生产B型号电脑的方法,联想工厂则可以生产出B型号的脸型电脑。可以看出,抽象工厂可以让每一个工厂分别生产其产品的各个型号。
先来看一下具体的实现:

#include <iostream>
using namespace std;
enum eComputer{
	lenovo,
	dell
}; 
class ProductA{
	public:
		virtual void show() = 0;
}; 
class Lenovo_A:public ProductA{
	public:
		void show()
		{
			cout << "Lenovo_A" << endl;
		}
};
class Dell_A:public ProductA{
	public:
		void show()
		{
			cout << "Dell_A" << endl;
		}
};
class ProductB{
	public:
		virtual void show() = 0;
}; 
class Lenovo_B:public ProductB{
	public:
		void show()
		{
			cout << "Lenovo_B" << endl;
		}
};
class Dell_B:public ProductB{
	public:
		void show()
		{
			cout << "Dell_B" << endl;
		}
};
class Factory{
	public:
		virtual ProductA* createA() = 0;
		virtual ProductB* createB() = 0;
 };

class LenovoFactory:public Factory{
	public:
		ProductA* createA()
		{
			return new Lenovo_A();
		}
		ProductB* createB()
		{
			return new Lenovo_B();
		}
};

class DellFactory:public Factory{
	public:
		ProductA* createA()
		{
			return new Dell_A();
		}
		ProductB* createB()
		{
			return new Dell_B();
		}
};	

int main()
{
	LenovoFactory *lf = new LenovoFactory();//创建联想工厂
	lf->createA()->show();//生产A型号
	lf->createB()->show();//生产B型号
	
	DellFactory *df = new DellFactory();//创建戴尔工厂
	df->createA()->show();//生产A型号
	df->createB()->show();//生产B型号
	
	delete lf;
	delete df;
	return 0;
}

运行结果如下所示:
在这里插入图片描述
如此一来,就可以使用一个具体的工厂管理一个多种型号的产品。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
工厂模式是一种常见的创建型设计模式,用于创建对象,而不是通过直接调用构造函数来创建它们。工厂模式定义了一个接口,用于创建相关对象,但是让子类决定要实例化的类。在C++中,工厂模式可以通过以下步骤实现: 1. 创建一个抽象基类,该类定义了一个纯虚拟函数,该函数将返回一个指向基类的指针。这个基类就是我们的工厂接口。 ```c++ class Product { public: virtual ~Product() {} virtual void operation() = 0; }; ``` 2. 创建具体的产品类,它们继承自抽象基类,并实现了其纯虚拟函数。这些类就是我们的具体产品。 ```c++ class ConcreteProductA : public Product { public: void operation() override { /* 具体产品 A 的操作 */ } }; class ConcreteProductB : public Product { public: void operation() override { /* 具体产品 B 的操作 */ } }; ``` 3. 创建一个工厂类,该类实现了工厂接口,并根据需要创建具体的产品。这个工厂类就是我们的具体工厂。 ```c++ class Factory { public: virtual ~Factory() {} virtual std::unique_ptr<Product> createProduct() = 0; }; class ConcreteFactoryA : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductA>(); } }; class ConcreteFactoryB : public Factory { public: std::unique_ptr<Product> createProduct() override { return std::make_unique<ConcreteProductB>(); } }; ``` 4. 在客户端代码中使用具体工厂创建具体产品。 ```c++ int main() { std::unique_ptr<Factory> factory = std::make_unique<ConcreteFactoryA>(); std::unique_ptr<Product> product = factory->createProduct(); product->operation(); return 0; } ``` 这就是工厂模式的基本实现方式。通过这种方式,我们可以将对象的创建过程与客户端代码分离,从而更好地实现模块化和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值