工厂方法模式(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类。所以实际上接口只依赖于两个抽象类,不依赖具体类。维持了稳定。并将接口的实现细节封装起来。