工厂方法模式

工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品

类图如下:
写出来的程序只会依赖Creator和Product这两个抽象类,而不会依赖具体的类。
在这里插入图片描述
主要的思想就是,高层的模块应当依赖抽象类,而不是依赖具体的类。需要符合依赖倒置原则

依赖倒转原则

  • 高层模块不应该依赖低层模块,二者都应该依赖其抽象
  • 抽象不应该依赖细节,细节应该依赖抽象
  • 依赖倒转 ( 倒置 ) 的中心思想是面向接口编程
  • 使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成

代码:

Product.h

#pragma once

//抽象的产品类,是稳定的
class Product
{
public:
	virtual void operation() = 0;
	virtual ~Product() {}
};

ConcreteProduct.h

#pragma once
#include"Product.h"


//具体的产品类
class ConcreteProduct1 :public Product
{
public:
	void operation()
	{

	}
};

class ConcreteProduct2 : public Product
{
public:
	void operation()
	{

	}
};

Creator.h

#pragma once
#include"Product.h"

//抽象的创建者类
class Creator
{
public:
	virtual Product* FactoryMethod() = 0;
	virtual ~Creator() {}

	void SomeOpretion()
	{
		Product* product = this->FactoryMethod();

		delete product;
	}
};

ConcreteCreator.h

#pragma once
#include"Creator.h"

//实际的创建者类
class ConcreteCreator1 :public Creator
{
public:
	Product* FactoryMethod()
	{
		return new ConcreteProduct1();
	}
};

class ConcreteCreator2 :public Creator
{
public:
	Product* FactoryMethod()
	{
		return new ConcreteProduct2();
	}
};

main.cpp

#include"Product.h"
#include"ConcreteProduct.h"
#include"Creator.h"
#include"ConcreteCreator.h"

//对外提供的接口
void ClientCode(Creator* creator)
{
	creator->SomeOpretion();
}

int main()
{
	Creator* creator1 = new ConcreteCreator1();
	ClientCode(creator1);

	Creator* creator2 = new ConcreteCreator1();
	ClientCode(creator2);

	delete creator1;
	delete creator2;
}

从代码上可以看出,实际上对外的接口ClientCode只依赖于Creator类,而Creator类又依赖于Product类。所以实际上接口只依赖于两个抽象类,不依赖具体类。维持了稳定。并将接口的实现细节封装起来。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值