多态工厂的实现

工厂方法模式概述

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

工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而尤其子类来具体实现工厂方法,创建具体的产品对象。

工厂方法模式结构

工厂模式结构图中包含以下4个角色。

(1) 抽象产品:它是定义产品的接口,是工厂方法模式所创建对象的超类型。

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

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

(4)具体工厂:它是抽象工厂的子类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回一个具体产品类。

与简单工厂模式比较,工厂方法模式最重要的区别是引入了抽象工厂角色。

重载的工厂方法

可以提供一组重载的工厂方法,以不同的方式对产品对象进行创建。当然,对于同一个具体工厂而言,无论使用哪个重载的工厂方法,创建的产品类型均要相同。

工厂方法的隐藏

在工厂类中,直接调用产品类的业务方法,客户端无需调用工厂方法创建产品,,直接通过工厂即可使用所创建的对象中的业务方法。

抽象工厂类LoggerFactory代码示例如下:

abstract class LoggerFactory{public void writeLog(){Logger logger=this.createLogger();logger.writeLog();}public abstract LoggerFactory createLogger();}

工厂方法模式总结主要优点

1.在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体产品和具体工厂,而只要添加一个具体工厂和一个具体产品即可,系统可扩展性号,符合开闭原则。

主要缺点

1.添加新产品时,需要添加新的具体产品类和具体工厂,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,给系统带来了一些额外的开销。

适用场景

1.抽象工厂类通过其子类来指定创建哪个对象。

工厂方法模式的应用实例

日志记录器的设计

代码示例如下:

#include <iostream>using namespace std;//日记记录器接口:抽象产品class Logger{public:virtual void writeLog()=0;};//数据库日志记录器class DatabaseLogger:public Logger{public:void writeLog(){cout<<"数据库日志记录器"<<endl;}};//文件日志记录器:具体产品class FileLogger:public Logger{public:void writeLog(){cout<<"文件日志记录器"<<endl;}};//日志记录器工厂接口:抽象工厂class LoggerFactory{public:virtual Logger* createLogger()=0;};//数据库日志记录器工厂类:具体工厂class DatabaseLoggerFactory:public LoggerFactory{public:Logger* createLogger(){return new DatabaseLogger();}};//文件日志记录器工厂类:具体工厂class FileLoggerFactory:public LoggerFactory{public:Logger* createLogger(){return new FileLogger();}};//客户端测试代码int main(){LoggerFactory *loggerFactory=new DatabaseLoggerFactory();Logger *logger=loggerFactory->createLogger();logger->writeLog();return 0;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

别为荒漠的艰难而哭泣,只为奔流入海功成名就那一天,

多态工厂的实现

相关文章:

你感兴趣的文章:

标签云: