多态工厂的实现--工厂方法模式

工厂方法模式概述


在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。
工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而尤其子类来具体实现工厂方法,创建具体的产品对象。

工厂方法模式结构




工厂模式结构图中包含以下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;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值