C++ 设计模式--工厂模式

工厂模式:利用C++多态的特性,对对象的创建进行封装。

定义一个创建对象的接口,让其子类自己决定实力化哪一个工厂类,工厂模式使其创建过程延迟到子类进行

参考链接

  1. 简单工厂
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;


class Car
{
public:
	Car(string name) : m_name(name) {}
	~Car() {}
	virtual void show() = 0;

protected:
	string m_name;
};

class Bmw : public Car
{
public:
	Bmw(string name) : Car(name){}
	void show()
	{
		cout << "获取了一辆宝马汽车: " << m_name << endl;
	}

};

class Audi : public Car
{
public:
	Audi(string name) : Car(name) {}
	void show()
	{
		cout << "获取了一辆奥迪汽车: " << m_name << endl;
	}

};

// 简单工厂
enum carType
{
	BMW,
	AUDI,
};

class simpleFactory
{
public:
	Car* createCar(carType ct)
	{
		switch (ct)
		{
		case BMW:
			return new Bmw("x6");
		case AUDI:
			return new Audi("a8");
		default:
			cerr << "传入的参数错误" << ct << endl;
		}
		return nullptr;
	}

};
int main()
{
	// 智能指针 在使用了new以后不需要delete
	/*unique_ptr<simpleFactory> fac(new simpleFactory());
	unique_ptr<Car> p1(fac->createCar(BMW));
	unique_ptr<Car> p2(fac->createCar(AUDI));*/

	simpleFactory* fac = new simpleFactory();
	Car* p1 = fac->createCar(BMW);
	Car* p2 = fac->createCar(AUDI);

	p1->show();
	p2->show();

	return 0;
}
  1. 工厂方法
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
class Car
{
public:
	Car(string name) : m_name(name) {}
	~Car() {}
	virtual void show() = 0;

protected:
	string m_name;
};

class Bmw : public Car
{
public:
	Bmw(string name) : Car(name){}
	void show()
	{
		cout << "获取了一辆宝马汽车: " << m_name << endl;
	}

};

class Audi : public Car
{
public:
	Audi(string name) : Car(name) {}
	void show()
	{
		cout << "获取了一辆奥迪汽车: " << m_name << endl;
	}

};

// 工厂方法
// 基类
class factory
{
public:
	virtual Car* createCar(string name) = 0;

};

// 子类1
class BmwFac : public factory
{
public:
	Car* createCar(string name)
	{
		return new Bmw(name);
	}
};
// 子类2
class AudiFac : public factory
{
public:
	Car* createCar(string name)
	{
		return new Audi(name);
	}
};

int main()
{
	unique_ptr<factory> bmwFty(new BmwFac());
	unique_ptr<factory> audiFty(new AudiFac());
	unique_ptr<Car> p3(bmwFty->createCar("x7"));
	unique_ptr<Car> p4(audiFty->createCar("a9"));

	p3->show();
	p4->show();

	return 0;
}
  1. 抽象工厂
cpp 复制代码
#include <iostream>
#include <string>
using namespace std;
class Car
{
public:
	Car(string name) : m_name(name) {}
	~Car() {}
	virtual void show() = 0;

protected:
	string m_name;
};

class Bmw : public Car
{
public:
	Bmw(string name) : Car(name){}
	void show()
	{
		cout << "获取了一辆宝马汽车: " << m_name << endl;
	}

};

class Audi : public Car
{
public:
	Audi(string name) : Car(name) {}
	void show()
	{
		cout << "获取了一辆奥迪汽车: " << m_name << endl;
	}

};

// 抽象工厂 
// 增加另外一个类
class Light
{
public:
	virtual void show() = 0;

};

class BmwLight : public Light
{
public:
	void show()
	{
		cout << "BMW Light" << endl;
	}

};

class AudiLight : public Light
{
public:
	void show()
	{
		cout << "AUDI Light" << endl;
	}
};

class AbstractFactory
{
public:
	virtual Car* createCar(string name) = 0;
	virtual Light* createLight() = 0;

};

class BMWFactory : public AbstractFactory
{
public:
	Car* createCar(string name)
	{
		return new Bmw(name);
	}

	Light* createLight()
	{
		return new BmwLight();
	}

};

class AUDIFactory : public AbstractFactory
{
public:
	Car* createCar(string name)
	{
		return new Audi(name);
	}

	Light* createLight()
	{
		return new AudiLight();
	}

};

int main()
{
	unique_ptr<AbstractFactory> bmwfty(new BMWFactory());
	unique_ptr<AbstractFactory> audifty(new AUDIFactory());
	unique_ptr<Car> p5(bmwfty->createCar("x8"));
	unique_ptr<Car> p6(audifty->createCar("a10"));
	unique_ptr<Light> p7(bmwfty->createLight());
	unique_ptr<Light> p8(audifty->createLight());

	p5->show();
	p6->show();
	p7->show();
	p8->show();
	return 0;
}

其实感觉对于工厂模式的实现,看到第二种方式就差不多了,第三种只是在第二种基础上再增加一个类而已。之前在前司的时候项目中的代码有看到过这种设计模式的,当时还不了解设计模式,当时调代码的时候一步一步的走到了父类,父类还是一个模版,所以印象深刻。

相关推荐
汉汉汉汉汉42 分钟前
C++11新特性详解:从列表初始化到线程库
c++
楼田莉子2 小时前
C++算法题目分享:二叉搜索树相关的习题
数据结构·c++·学习·算法·leetcode·面试
大锦终3 小时前
【算法】模拟专题
c++·算法
whitepure3 小时前
万字详解Java中的面向对象(二)——设计模式
java·设计模式
方传旺3 小时前
C++17 std::optional 深拷贝 vs 引用:unordered_map 查询大对象性能对比
c++
Dontla3 小时前
Makefile介绍(Makefile教程)(C/C++编译构建、自动化构建工具)
c语言·c++·自动化
何妨重温wdys4 小时前
矩阵链相乘的最少乘法次数(动态规划解法)
c++·算法·矩阵·动态规划
重启的码农4 小时前
ggml 介绍 (6) 后端 (ggml_backend)
c++·人工智能·神经网络
重启的码农4 小时前
ggml介绍 (7)后端缓冲区 (ggml_backend_buffer)
c++·人工智能·神经网络
雨落倾城夏未凉4 小时前
5.通过拷贝构造函数复制一个对象,假如对象的成员中有个指针类型的变量,如何避免拷贝出来的副本中的该成员之下行同一块内存(等价于默认拷贝构造函数有没有缺点)
c++·后端