C++设计模式3:工厂模式

工厂模式都是在那种有着大量类的程序里面使用的,比如我突然要产生许多的类,这时候就可以用工厂模式,工厂模式有如下三种类型。

简单工厂

用户输入实例化的信息(比如产品名称),向工厂申请对象,工厂返回相应的对象,用户完全不需要知道,这个对象的具体构造方式,封装了对象的创建。

cpp 复制代码
#include<iostream>
using namespace std;
class Car
{
public:
	Car() {}
	~Car() {}
	virtual void show() = 0;
};
class Audi:public Car
{
public:
	Audi() {}
	~Audi() {}
	void show()
	{
		cout << "this is Audi" << endl;
	}
};
class Baoma :public Car
{
public:
	Baoma() {}
	~Baoma() {}
	void show()
	{
		cout << "this is Baoma" << endl;
	}
};
enum CarType
{
	BAOMA,AUDI
};
class SimpleFactory
{
public:
	SimpleFactory() {}
	~SimpleFactory(){}
	Car*  createCar(CarType type)
	{
		switch (type)
		{
		case BAOMA:
			return new Baoma();
		case AUDI:
			return new Audi();
		}
	}
};
int main()
{
	SimpleFactory factory;
	unique_ptr< Car>myaudi(factory.createCar(AUDI));
	unique_ptr< Car>mybaoma(factory.createCar(BAOMA));
	myaudi->show();
	mybaoma->show();
	return 0;
}

简单工厂存在明显的缺点,那就是如果要产生新的产品,就需要改变源头的工厂类,因为简单工厂只有一个工厂,这不符合软件设计的开闭原则。

工厂方法

实现能够产生不同产品的工厂,用这些工厂产生它们对应的产品,如果有新的产品,就添加工厂类就可以了,完全不用改变之前实现的工厂类。

cpp 复制代码
#include<iostream>
using namespace std;
class Car
{
public:
	Car() {}
	~Car() {}
	virtual void show() = 0;
};
class Audi:public Car
{
public:
	Audi() {}
	~Audi() {}
	void show()
	{
		cout << "this is Audi" << endl;
	}
};
class Baoma :public Car
{
public:
	Baoma() {}
	~Baoma() {}
	void show()
	{
		cout << "this is Baoma" << endl;
	}
};
class FactoryMethod
{
public:
	virtual	Car* createCar() = 0;
};
class AudiFactory:public FactoryMethod
{
public:
	Car* createCar()
	{
		return new Audi();
	}
};
class BaoMaFactory:public FactoryMethod
{
public:
	Car* createCar()
	{
		return new Baoma();
	}
};
int main()
{
	unique_ptr<FactoryMethod>audifactory(new AudiFactory());
	unique_ptr<FactoryMethod>baomafactory(new BaoMaFactory());
	unique_ptr< Car>myaudi(audifactory->createCar());
	unique_ptr< Car>mybaoma(baomafactory->createCar());
	myaudi->show();
	mybaoma->show();
	return 0;
}

抽象工厂

把有关联关系的,属于一个产品簇的所有产品创建的接口函数,放在一个抽象工厂里面,派生类应该负责创建该产品簇里面的所有产品,比如华为和小米都是派生类,抽象工厂要生产手机和耳机以及充电头,那么小米和华为这两个派生类工厂,就要产生这些产品。

显然,抽象工厂也有不好的地方,假如我华为要产生手机芯片这一新的产品,那么抽象工厂就要跟着改变,由于抽象工厂类是抽象的,所以所有派生类都要实现那个产生芯片的函数,不然派生类也会变成抽象类,但是小米不一定要自己生产芯片。

cpp 复制代码
#include<iostream>
using namespace std;
class Car
{
public:
	Car() {}
	~Car() {}
	virtual void show() = 0;
};
class Audi:public Car
{
public:
	Audi() {}
	~Audi() {}
	void show()
	{
		cout << "this is Audi" << endl;
	}
};
class Baoma :public Car
{
public:
	Baoma() {}
	~Baoma() {}
	void show()
	{
		cout << "this is Baoma" << endl;
	}
};
class Light
{
public:
	Light() {}
	~Light() {}
	virtual void show() = 0;
};
class AudiLight:public Light
{
public:
	AudiLight() {}
	~AudiLight() {}
	 void show()
	{
		 cout << "this is AudiLight" << endl;
	}
};
class  BaoMaLight :public Light
{
public:
	BaoMaLight() {}
	~BaoMaLight() {}
	void show()
	{
		cout << "this is BaoMaLight" << endl;
	}
};
class AbstractFactory
{
public:
	virtual	Car* createCar() = 0;
	virtual Light* createLight() = 0;
};
class AudiFactory:public AbstractFactory
{
public:
	Car* createCar()
	{
		return new Audi();
	}
	Light* createLight()
	{
		return new AudiLight();
	}
};
class BaoMaFactory:public AbstractFactory
{
public:
	Car* createCar()
	{
		return new Baoma();
	}
	Light* createLight()
	{
		return new BaoMaLight();
	}
};
int main()
{
	unique_ptr<AbstractFactory>audifactory(new AudiFactory());
	unique_ptr<AbstractFactory>baomafactory(new BaoMaFactory());
	unique_ptr< Car>myaudi(audifactory->createCar());
	unique_ptr< Car>mybaoma(baomafactory->createCar());
	unique_ptr<Light>myaudilight(audifactory->createLight());
	unique_ptr<Light>mybaomalight(baomafactory->createLight());
	myaudi->show();
	myaudilight->show();
	mybaoma->show();
	mybaomalight->show();
	return 0;
}

显然,抽象工厂也有不好的地方,假如我华为要产生手机芯片这一新的产品,那么抽象工厂就要跟着改变,由于抽象工厂类是抽象的,所以所有派生类都要实现那个产生芯片的函数,不然派生类也会变成抽象类,但是小米不一定要自己生产芯片。

相关推荐
ZK_H2 分钟前
嵌入式c语言——关键字其6
c语言·开发语言·计算机网络·面试·职场和发展
澈2077 分钟前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
A.A呐8 分钟前
【C++第二十九章】IO流
开发语言·c++
ambition2024237 分钟前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_39 分钟前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
kebeiovo1 小时前
atomic原子操作实现无锁队列
服务器·c++
Yungoal1 小时前
常见 时间复杂度计算
c++·算法
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 48. 旋转图像 | C++ 矩阵变换题解
c++·leetcode·矩阵
yashuk1 小时前
C语言实现PAT练习及算法学习笔记,还有SQLite介绍
c语言·sqlite·开源项目·算法学习·pat练习
ACP广源盛139246256732 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑