0
点赞
收藏
分享

微信扫一扫

【C++设计模式】三种常规的工厂模式

鱼板番茄 2022-02-08 阅读 87

一、背景

工厂模式提供创建对象的最佳模式,在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
具体到C++项目中,可以使用C++多态特性将存在继承关系的类通过工厂类创建对应的子类对象,在项目复杂的情况下,可以便于子类对象的创建。
工厂模式主要分为三种,简单工厂模式工厂方法模式抽象工厂模式

1.简单工厂模式

简单工厂模式的UML类图如下,图中主要有三个类,抽象产品类(Phone)、具体产品类(iPhone和Huawei)和工厂类(PhoneFactory)。
简单工厂模式特点:
1.工厂类封装了创建具体产品对象的函数;
2.新增产品时需要新增对应的具体产品类并且还要修改工厂类.
简单工厂模式UML类图 简单工厂类代码实例

#include <iostream>
class Phone
{
public:
	virtual ~Phone() {};
	virtual void show() = 0;
};
class iPhone : public Phone
{
public:
	void show() override {
		std::cout << "I'm Apple" << std::endl;
	}
};
class Huawei : public Phone
{
public:
	void show() override {
		std::cout << "I'm Huawei" << std::endl;
	}
};

enum PhoneType
{
	IPHONE,
	HUAWEI
};
class PhoneFactory
{
public:
	Phone* createPhone(PhoneType kType) {
		switch (kType) {
		case IPHONE:
			return new iPhone();
		case HUAWEI:
			return new Huawei();
		default:
			return NULL;
		} 
	}
};

int main()
{
	PhoneFactory phonefactory;
	Phone* huawei = phonefactory.createPhone(HUAWEI);
	if (huawei) {
		huawei->show();
		delete huawei;
		huawei = NULL;
	}
	Phone* apple = phonefactory.createPhone(IPHONE);
	if (apple) {
		apple->show();
		delete apple;
		apple = NULL;
	}
}

2.工厂方法模式

简单工厂模式和工厂方法模式的区别:
1.简单工厂模式包括抽象产品类、具体产品类和工厂类;而工厂方法模式包括抽象产品类,具体产品类和抽象工厂类和具体工厂类。抽象工厂类不再创建具体的产品类,而是由具体工厂类来创建;
2.新增一个产品,简单工厂模式需要增加具体产品类并且修改工厂类,而工厂方法类则是需要增加具体产品类和具体工厂类。

#include <iostream>

class Phone
{
public:
	virtual ~Phone() {};
	virtual void show() = 0;
};

class iPhone : public Phone
{
public:
	void show() override {
		std::cout << "I'm Apple" << std::endl;
	}
};

class Huawei : public Phone
{
public:
	void show() override {
		std::cout << "I'm Huawei" << std::endl;
	}
};

enum PhoneType
{
	IPHONE,
	HUAWEI
};

class PhoneFactory
{
public:
	virtual ~PhoneFactory() {};
	virtual Phone* creatPhone() = 0;
};

class iPhoneFactory : public PhoneFactory
{
public:
	Phone* creatPhone() override {
		return new iPhone();
	}
};

class HuaweiFactory : public PhoneFactory
{
public:
	Phone* creatPhone() override {
		return new Huawei();
	}
};

int main()
{
	iPhoneFactory appleFact;
	Phone* apple = appleFact.creatPhone();
	apple->show();
	delete apple;

	HuaweiFactory huaweiFact;
	Phone* huawei = huaweiFact.creatPhone();
	huawei->show();
	delete huawei;
}

2.抽象工厂模式

抽象工厂模式和工厂方法模式很类似,主要还是有以下四个大的类:
1.抽象产品类;
2.具体产品类;
3.抽象工厂类;
4.具体工厂类;
不同之处在于: 抽象工厂模式中抽象工厂类不只提供创建单一的抽象产品类,具体工厂类同样不再提供创建单一的具体产品类,而是可以创建多个。对于上面的例子PhoneFactory抽象工厂类不但能通过createPhone生产手机,还可以通过createPad生产平板,这也就需要新增抽象平板类Pad,和具体平板类iPad和HuaweiPad,这里画出UML类图,不再给出代码实例。
在这里插入图片描述

举报

相关推荐

0 条评论