工厂模式

本文介绍了三种工厂模式:简单工厂模式、工厂方法模式及抽象工厂模式。分别阐述了它们的设计原理、应用场景及优缺点,并通过示例代码展示了每种模式的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单工厂模式

    根据参数的不同返回不同的实例。当你需要什么只需要传一个正确的参数,就可以获取你所需要的对象,无需知道创建细节
1、能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
2、这个类的职责过重,如果发生意外,会影响到很多使用这个工厂的模块
3、当系统中的具体产品类不断增多时候,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

#include <iostream>
#include <string>

class Product
{
public:
	Product(std::string name):mname(name){}
	virtual void operation()=0;
	virtual ~Product(){}
protected:
	std::string mname;
};
class ProductA:public Product
{
public:
	ProductA(std::string name):Product(name){}
	virtual void operation()
	{
		std::cout<<"this is a "<<mname<<std::endl;
	}
};

class ProductB:public Product
{
public:
	ProductB(std::string name):Product(name){}
	virtual void operation()
	{
		std::cout<<"this is a "<<mname<<std::endl;
	}
};

class Factory
{
public:
	Product* createProduct(int flag)
	{
		switch(flag)
		{
		case 1:
			return new ProductA("A");
			break;
		case 2:
			return new ProductB("B");
			break;
		default:
			break;
		}
	}
};

int main()
{
	Factory f;
	Product* pp = f.createProduct(2);
	pp->operation();//动多态
	delete pp;
	return 0;
}

工厂方法模式

一个产品一个工厂生产
    在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
    缺点:增加产品时,类的个数成倍增加,导致类越来越多,增加维护成本
    优点:符合开闭原则

#include <iostream>
#include <string>

class Product
{
public:
	Product(std::string name):mname(name){}
	virtual void operation()=0;
	virtual ~Product(){}
protected:
	std::string mname;
};

class ProductA:public Product
{
public:
	ProductA(std::string name):Product(name){}
	virtual void operation()
	{
		std::cout<<"this is a "<<mname<<std::endl;
	}
};

class ProductB:public Product
{
public:
	ProductB(std::string name):Product(name){}
	virtual void operation()
	{
		std::cout<<"this is a "<<mname<<std::endl;
	}
};

class Factory
{
public:
	virtual Product* createProduct()=0;
	virtual ~Factory(){}
};

class FactoryA:public Factory
{
public:
	Product* createProduct()
	{
		return new ProductA("A");
	}
};

class FactoryB:public Factory
{
public:
	Product* createProduct()
	{
		return new ProductB("B");
	}
};

class ProductC:public Product
{
public:
	ProductC(std::string name):Product(name){}
	virtual void operation()
	{
		std::cout<<"this is a "<<mname<<std::endl;
	}
};

class FactoryC:public Factory
{
public:
	Product* createProduct()
	{
		return new ProductC("C");
	}
};

int main()
{
	Factory *pf=new FactoryC();
	Product* pp = pf->createProduct();
	pp->operation();

	delete pf;
	delete pp;
	return 0;
}

抽象工厂模式

    抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
产品族
    是指位于不同产品等级结构中,功能相关联的产品组成的家族。一般是位于不同的等级结构中的相同位置上。
    工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。

#include <iostream>
#include <string>

class ProductA
{
public:
	ProductA(std::string name):mname(name){}
	virtual void operation()=0;
	virtual ~ProductA(){}
protected:
	std::string mname;
};

class ProductA1:public ProductA
{
public:
	ProductA1(std::string name):ProductA(name){}
	virtual void operation()
	{
		std::cout<<"this is a "<<mname<<std::endl;
	}
};

class ProductA2:public ProductA
{
public:
	ProductA2(std::string name):ProductA(name){}
	virtual void operation()
	{
		std::cout<<"this is a "<<mname<<std::endl;
	}
};

class ProductB
{
public:
	ProductB(std::string name):mname(name){}
	virtual void operation()=0;
	virtual ~ProductB(){}
protected:
	std::string mname;
};

class ProductB1:public ProductB
{
public:
	ProductB1(std::string name):ProductB(name){}
	virtual void operation()
	{
		std::cout<<"this is a "<<mname<<std::endl;
	}
};

class ProductB2:public ProductB
{
public:
	ProductB2(std::string name):ProductB(name){}
	virtual void operation()
	{
		std::cout<<"this is a "<<mname<<std::endl;
	}
};

class AbstractFactory
{
public:
	virtual ProductA* createProductA()=0;
	virtual ProductB* createProductB()=0;
	virtual ~AbstractFactory(){}
};

class Factory_1:public AbstractFactory
{
public:
	ProductA* createProductA()
	{
		return new ProductA1("A1");
	}
	ProductB* createProductB()
	{
		return new ProductB1("B1");
	}
};

class Factory_2:public AbstractFactory
{
public:
	ProductA* createProductA()
	{
		return new ProductA2("A2");
	}
	ProductB* createProductB()
	{
		return new ProductB2("B2");
	}
};

int main()
{
	AbstractFactory *paf=new Factory_2();
	ProductA* pa = paf->createProductA();
	ProductB* pb = paf->createProductB();
	pa->operation();
	pb->operation();

	delete paf;
	delete pa;
	delete pb;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值