【设计模式】工厂模式(c++实现)

本文介绍了设计模式中的简单工厂、工厂方法和抽象工厂模式,通过示例代码展示了它们各自的特点和应用场景。简单工厂模式通过静态方法创建对象,但存在冗余代码和单一职责原则问题;工厂方法模式将创建对象的责任交给子类,增强了扩展性;抽象工厂模式则针对一系列相关产品提供创建接口,提高了灵活性。通过对这三种模式的理解,开发者可以更好地选择适合的代码组织方式来应对不同的需求变化。
摘要由CSDN通过智能技术生成

简单工厂模式

一个工厂,按照菜单,创建多个实例

class PayMent
{
public:
	virtual void  Pay() = 0;
	virtual ~PayMent() {}

};
class AliPay :public PayMent
{
public:
	void Pay()
	{
		std::cout << "AliPay" << std::endl;
	}
	~AliPay() {}
};
class WeChatPay :public PayMent
{
public:
	void Pay()
	{
		std::cout << "WeChatPay" << std::endl;
	}
	~WeChatPay() {}
};
class Factory
{
public:
	static std::unique_ptr<PayMent>  CreatPayMent(const std::string name)
	{
		
		if ("AliPay" == name)
		{
			return std::unique_ptr<PayMent>(new AliPay());
		}
		else if ("WeChatPay" == name)
		{
			return std::unique_ptr<PayMent>(new WeChatPay());
		}
		
	}

};
int main()
{
	std::unique_ptr<PayMent> pm = Factory::CreatPayMent("AliPay");
	pm->Pay();
	std::unique_ptr<PayMent> pm2 = Factory::CreatPayMent("WeChatPay");
	pm2->Pay();
	return 0;
}

优点:扩充的时候很简单,只需要添加class 和if就可以了
缺点
1.包含了很多if else 代码块,整个代码相当冗长,代码越长,阅读维护,测试的难度越大,而且大量的if else还会影响系统的性能。
的条件还影响系统的性能。
2.CreatePayMent方法负责构建所有的PayMent,违反了单一职责原则,

对上面的稍做改进

class PayMent
{
public:
	virtual void  Pay() = 0;
	virtual ~PayMent() {}

};
class AliPay :public PayMent
{
public:
	void Pay()
	{
		std::cout << "AliPay" << std::endl;
	}
	~AliPay() {}
};
class WeChatPay :public PayMent
{
public:
	void Pay()
	{
		std::cout << "WeChatPay" << std::endl;
	}
	~WeChatPay() {}
};
class Factory
{
public:
	Factory()
	{
		std::string arr[] = { "AliPay","WeChatPay" };
		for (auto str : arr)
		{
			payMent_.emplace(str, CreatePayMent(str));
				
		}
	}
	static std::shared_ptr<PayMent> CreatePayMent(const std::string name)
	{

		if ("AliPay" == name)
		{
			return std::shared_ptr<PayMent>(new AliPay());
		}
		else if("WeChatPay" == name)
		{
			return std::shared_ptr<PayMent>(new WeChatPay());
		}

	}
	static std::shared_ptr<PayMent> GetPayMent(const std::string& name)
	{
		return payMent_[name];
	}
private:
	static std::map<std::string, std::shared_ptr<PayMent>> payMent_;

};
std::map<std::string, std::shared_ptr<PayMent>> Factory:: payMent_;
int main()
{
	Factory factory;
	std::shared_ptr<PayMent> pm = factory.GetPayMent("AliPay");
	pm->Pay();
	std::shared_ptr<PayMent> pm2 = factory.GetPayMent("WeChatPay");
	pm2->Pay();
	return 0;
}

把实例存放在map中,使用的使用一获取,可以复用这些对象,从而避免了使用的时候再创建,使用完之后又销毁,减少了对象的创建。

工厂方法模式

多个工厂,按照菜单,创建多个实例。

class PayMent
{
public:
	virtual void Pay() = 0;
	virtual ~PayMent(){}
};
class AliPay :public PayMent
{
public:
	void Pay()
	{
		std::cout << "AliPay" << std::endl;
	}
	~AliPay() {}
};
class WeChatPay :public PayMent
{
public:
	void Pay()
	{
		std::cout << "WeChatPay" << std::endl;
	}
	~WeChatPay() {}
};
class Factory
{
public:
	virtual std::unique_ptr<PayMent> GetPayMent() = 0;

};
class AliPayFactory : public Factory
{
public:
	std::unique_ptr<PayMent> GetPayMent()
	{
		return std::unique_ptr<PayMent>(new AliPay());
	}
};
class WeChatFactory : public Factory
{
public:
	std::unique_ptr<PayMent> GetPayMent()
	{
		return std::unique_ptr<PayMent>(new WeChatPay());
	}
};
int main()
{
	AliPayFactory aliPayFactory;
	WeChatFactory weChartFactory;
	std::unique_ptr<PayMent> pm = aliPayFactory.GetPayMent();
	std::unique_ptr<PayMent> pm2 = weChartFactory.GetPayMent();
	pm->Pay();
	pm2->Pay();

	return 0;
}

优点:相对于简单工厂,扩展性好,只需要添加实例类和对应的工厂。

抽象工厂模式

按照工厂菜单,创建专用工厂。
再用专用工厂,按照产品菜单,创建实例

class PayMent
{
public:
	virtual void Pay() = 0;
	virtual ~PayMent() {}
};
class AliPay :public PayMent
{
public:
	void Pay()
	{
		std::cout << "AliPay" << std::endl;
	}
	~AliPay() {}
};
class WeChatPay :public PayMent
{
public:
	void Pay()
	{
		std::cout << "WeChatPay" << std::endl;
	}
	~WeChatPay() {}
};
class AbstractFactory
{
public:
	virtual std::unique_ptr<PayMent> GetPayMent() = 0;

};
class AliPayMentFactory : public AbstractFactory
{
public:
	std::unique_ptr<PayMent> GetPayMent()
	{
		return std::unique_ptr<PayMent>(new AliPay());
	}

};
class WeChatMentFactory : public AbstractFactory
{
public:
	std::unique_ptr<PayMent> GetPayMent()
	{
		return std::unique_ptr<PayMent>(new WeChatPay());
	}

};
class FactoryProducer
{
public:
	std::unique_ptr<AbstractFactory> GetFactory(const std::string & name)
	{
		if ("AliPayMentFactory" == name)
		{
			return std::unique_ptr<AbstractFactory>(new AliPayMentFactory());
		}
		else if ("WeChatMentFactory" == name)
		{
			return std::unique_ptr<AbstractFactory>(new WeChatMentFactory());
		}
	}

};
int main()
{
	FactoryProducer factoryProducer;
	std::unique_ptr<AbstractFactory> af = factoryProducer.GetFactory("AliPayMentFactory");
	std::unique_ptr<AbstractFactory> af2 = factoryProducer.GetFactory("WeChatMentFactory");
	std::unique_ptr<PayMent> pm = af->GetPayMent();
	std::unique_ptr<PayMent> pm2 = af2->GetPayMent();
	pm->Pay();
	pm2->Pay();

	return 0;
}

优点:面向一类产品创建工厂,这一类产品具有统一的属性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值