C++设计模式——工厂方法模式

工厂方法模式(Factory Method)

**工厂方法模式(Factory Method Pattern):**定义一个用于创建对象的接口,让子类决定将哪一个类实 例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。工厂方法模式是一种类创建型模式。

“对象创建”模式

通过“对象创建”模式绕开new,来避免对象创建 (new) 过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。

典型模式:
  • Factory Method

  • Abstract Factory

  • Prototype

  • Builder

动机(Motivation)

在软件系统中,经常面临着创建对象的工作;由于需求的变化需要创建的对象的具体类型经常变化。

如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?

模式定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类Factory Method使得一个类的实例化延迟 (目的:解耦,手段: 虚函数)到子类。 ——《设计模式》GoF

结构(Struture)

C++设计模式——工厂方法模式_第1张图片

在工厂方法模式结构图中包含如下几个角色:

  • Product(抽象产品):它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品 对象的公共父类。

  • ConcreteProduct(具体产品):它实现了抽象产品接口,某种类型的具体产品由专门的具体工 厂创建,具体工厂和具体产品之间一一对应。

  • Crereator(抽象工厂):在抽象工厂类中,声明了工厂方法(Factory Method),用于返回一个产 品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。

  • ConcreteFactory(具体工厂):它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并 可由客户端调用,返回一个具体产品类的实例。 与简单工厂模式相比,工厂方法模式最重要的区别是引入了抽象工厂角色,抽象工厂可以是接口,也可 以是抽象类或者具体类。

实例

设定如下场景,因为文件日志与数据库日志的初始化方式不同,所以无法使用简单工厂模式进行简单的 统一创建。 需要对每个类型进行特化版本的工厂创建。 即工厂方法模式

class Logger {
public:
virtual void writeLog()const = 0;
virtual ~Logger() {}
};
class FileLogger :public Logger {
private:c
FILE* fp;
public:
FileLogger() {
}
~FileLogger() {
}
void writeLog() const {
cout << "file " << endl;
}
};
class DataBaseLogger : public Logger {
private:
//MySql* mysql;
public:
DataBaseLogger() {
}
void writeLog() const {
cout << "database " << endl;
}
};
class LoggerFactory {
virtual Logger* createLogger() = 0;
};
class FileLoggerFactory : LoggerFactory {
Logger* createLogger() {
return new DataBaseLogger();
}
};
class DataBaseLoggerFactory: LoggerFactory {
Logger* createLogger() {
return new FileLogger();
}
};

优缺点

优点: 扩展性好,符合了开闭原则,新增一种产品时,只需增加改对应的产品类和对应的工厂子类即可。

缺点: 每增加一种产品,就需要增加一个对象的工厂。

如果这家公司发展迅速,推出了很多新的处理器核,那 么就要开设相应的新工厂。在C++实现中,就是要定义一个个的工厂类。显然,相比简单工厂模式,工 厂方法模式需要更多的类定义。

在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供 不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。

要点总结

  • Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。

  • Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展 (而非更改)的策略,较好地解决了这种紧耦合关系。

  • Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

你可能感兴趣的:(C++设计模式,c++,设计模式,工厂方法模式)