【c++】工厂模式

工厂模式的两个最重要功能:

(1)定义创建对象的接口,封装了对象的创建

(2)使得具体化类的工作延迟到子类中

1.简单工厂模式

#include<iostream>

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

class ProductA:public Product
{
public:
	ProductA(std::string name):Product(name)
	{}
	virtual void operation()
	{
		std::cout<<"A"<<std::endl;
	}
	virtual ~ProductA(){}
};

class ProductB:public Product
{
public:
	ProductB(std::string name):Product(name){}
	virtual void operation()
	{
		std::cout<<" B"<<std::endl;
	}
	virtual ~ProductB(){}
};

class Factory
{
public:
	Product* create(int flag)
	{
		switch(flag)
		{
			case 1:
				return new ProductA("PA");
				break;
			case 2:
				return new ProductB("PB");
				break;
			default:
				std::cout<<"can not product"<<std::endl;
				break;
		}
	}
};

int main()
{
	Factory *p = new Factory();
	Product *pro = p->create(1);
	pro->operation();
        delete p;
        delete pro;
	return 0;
}

此时,若是想多生产C产品,若是直接在switch语句中强制添加会破坏开放封闭性原则。此时考虑工厂方法模式,就是为每一个产品生产开一个工厂,准守了开放封闭性原则。

2.工厂方法模式

#include<iostream>

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

class ProductA:public Product
{
public:
	ProductA(std::string name):Product(name){}
	virtual void operation()
	{
		std::cout<<"A"<<std::endl;
	}
	virtual ~ProductA(){}
};

class ProductB:public Product
{
public:
	ProductB(std::string name):Product(name){}
	virtual void operation()
	{
		std::cout<<"A"<<std::endl;
	}
	virtual ~ProductB(){}
};
class ProductC:public Product
{
public:
	ProductC(std::string name):Product(name){}
	virtual void operation()
	{
		std::cout<<"A"<<std::endl;
	}
	virtual ~ProductC(){}
};

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

class FactoryA:public Factory
{
public:
	virtual Product* create()
	{
		return new ProductA("PA");
	}
	virtual ~FactoryA(){};
};

class FactoryB:public Factory
{
public:
	virtual Product* create()
	{
		return new ProductB("PB");
	}
	virtual ~FactoryB(){};
};

class FactoryC:public Factory
{
public:
	virtual Product* create()
	{
		return new ProductC("PC");
	}
	virtual ~FactoryC(){};
};
int main()
{
	Factory *p = new FactoryA;
	Product* pro = p->create();
	pro->operation();
        delete p;
        delete pro;
	return 0;
}

 

3.抽象工厂模式

解决创建一组或相互依赖的对象

#include<iostream>


class ProductA
{
public:
	ProductA(std::string name) :mname(name){}
	virtual void operation() = 0;
	virtual ~ProductA(){}
protected:
	std::string mname;
};
class ProductB
{
public:
	ProductB(std::string name) :mname(name){}
	virtual void operation() = 0;
	virtual ~ProductB(){}
protected:
	std::string mname;
};
class ProductA1 :public ProductA
{
public:
	ProductA1(std::string name) :ProductA(name){}
	void operation()
	{
		std::cout << "A1" << std::endl;
	}
};
class ProductA2 :public ProductA
{
public:
	ProductA2(std::string name) :ProductA(name){}
	void operation()
	{
		std::cout << "A2" << std::endl;
	}
};
class ProductB1 :public ProductB
{
public:
	ProductB1(std::string name) :ProductB(name){}
	void operation()
	{
		std::cout << "B1" << std::endl;
	}
};
class ProductB2 :public ProductB
{
public:
	ProductB2(std::string name) :ProductB(name){}
	void operation()
	{
		std::cout << "B2" << std::endl;
	}
};

class AbstractFactory
{
public:
	virtual ProductA* createProductA() = 0;
	virtual ProductB* createProductB() = 0;
	virtual ~AbstractFactory(){}
};
class Factory_1 : public AbstractFactory
{
public:
	virtual ProductA* createProductA()
	{
		return new ProductA1("PA1");
	}
	virtual ProductB* createProductB()
	{
		return new ProductB1("PB1");
	}
};
class Factory_2 : public AbstractFactory
{
public:
	virtual ProductA* createProductA()
	{
		return new ProductA2("PA2");
	}
	virtual ProductB* createProductB()
	{
		return new ProductB2("PB2");
	}
};

int main()
{
	AbstractFactory *p = new Factory_1();
	ProductA* pro = p->createProductA();
	pro->operation();
	ProductB* pre = p->createProductB();
	pre->operation();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值