首页 > 其他分享 >设计模式之Factory模式

设计模式之Factory模式

时间:2023-08-29 10:04:56浏览次数:27  
标签:__ CProductA CConcreterFactory 设计模式 子类 Factory 模式 include


在面向对象系统设计中经常可以遇到以下的两类问题:
1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就编写诸如new ×××;的代码。这里带来两个问题1)客户程序员必须知道实际子类的名称(当系统复杂后,命名将是一个很不好处理的问题,为了处理可能的名字冲突,有的命名可能并不是具有很好的可读性和可记忆性,就姑且不论不同程序员千奇百怪的个人偏好了。),2)程序的扩展性和维护变得越来越困难。

2)还有一种情况就是在父类中并不知道具体要实例化哪一个具体的子类。这里的意思为:假设我们在类A中要使用到类B,B是一个抽象父类,在A中并不知道具体要实例化那一个B的子类,但是在类A的子类D中是可以知道的。在A中我们没有办法直接使用类似于new ×××的语句,因为根本就不知道×××是什么。

 

Factory模式的两个最重要的功能:
1)定义创建对象的接口,封装了对象的创建;
2)使得具体化类的工作延迟到了子类中。

我们通常使用Factory模式来解决上面给出的两个问题。在第一个问题中,我们经常就是声明一个创建对象的接口,并封装了对象的创建过程。Factory这里类似于一个真正意义上的工厂(生产对象)。在第二个问题中,我们需要提供一个对象创建对象的接口,并在子类中提供其具体实现(因为只有在子类中可以决定到底实例化哪一个类)。

 

Factory.h

#ifndef __FACTORY_H_
#define __FACTORY_H_
#include "Product.h"
class CFactory
{
public:
	CFactory(){}
	~CFactory(){}
	virtual CProduct* CreateProduct()=0;
};
#endif

 

ConcreterFactory.h

#ifndef __CONCRETERFACTORY_H_
#define __CONCRETERFACTORY_H_
#include "Factory.h"
class CConcreterFactory:public CFactory
{
public:
	CConcreterFactory();
	~CConcreterFactory();
	CProduct* CreateProduct();
};
#endif

 

ConcreterFactory.cpp

#include "ConcreterFactory.h"
#include "ProductA.h"
CConcreterFactory::CConcreterFactory()
{

}

CConcreterFactory::~CConcreterFactory()
{

}

CProduct* CConcreterFactory::CreateProduct()
{
	return new CProductA;
}

ProductA.h

#ifndef __PRODUCTA_H_
#define __PRODUCTA_H_
#include "Product.h"
class CProductA:public CProduct
{
public:
	CProductA();
	~CProductA();
	void ConcreterProduct();
};
#endif

 

ProductA.cpp

#include "ProductA.h"
#include <iostream>
using namespace std;
CProductA::CProductA()
{
	cout<<"ProductA"<<endl;
}

CProductA::~CProductA()
{

}

void CProductA::ConcreterProduct()
{
	cout<<"ProductA"<<endl;
}

Main.cpp

#include <iostream>
#include "Factory.h"
#include "ProductA.h"
#include "ConcreterFactory.h"
using namespace std;
int main()
{
	CFactory *pFac=new CConcreterFactory;
	CProduct *pPr=pFac->CreateProduct();
	return 0;
}

 

标签:__,CProductA,CConcreterFactory,设计模式,子类,Factory,模式,include
From: https://blog.51cto.com/u_13566975/7272485

相关文章

  • 3.2.2 预览模式
    一、预览模式1.普通报表标签预览填报预览数据分析移动端预览2.决策报表PC端预览开发者调试移动端预览......
  • golang官方包管理vendor模式无法引用非go文件
    主页微信公众号:密码应用技术实战博客园首页:https://www.cnblogs.com/informatics/背景&问题golang作为高级计算机语言之一,在云原生以及web网站建设中发挥了重要作用,但在实际应用中我们可能会碰到以下场景,在该场景下:部署机无法访问外网,无法直接从互联网下载依赖包golang依......
  • 报名开启丨邀你一起探索云端 AI 新兴技术和发展模式
    在数字化和信息化的大潮中,大模型和AIGC正悄然引领一场深刻的变革,数字技术与各行各业深度融合,互联网企业遇到了业务高质量增长速度和成本过大的冲突,高质量发展变成企业转型的核心命题。云服务商通过智能托管,AI大模型为企业构建以AI内核驱动能力的产业应用,帮助企业数字化升级和......
  • 剖析网卡绑定模式
    目前网卡绑定mode共有七种(0~6)bond0、bond1、bond2、bond3、bond4、bond5、bond6常用的有三种:mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定......
  • RTSP/Onvif协议安防视频平台EasyNVR录像模式自定义操作
    TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif流媒体协议接入,并能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中,EasyNVR可提供视频实时监控直播、云端录像、云存储、录像检索与回看、告......
  • 让你的网站IE8浏览自动用IE7兼容模式
    文件兼容性用于定义让IE如何编译你的网页。此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式。前言为了帮助确保你的网页在所有未来的IE版本都有一致的外观,IE8引入了文件兼容性。在IE6中引入一个增设的兼容性模式,文件兼容性使你能够在IE呈......
  • Java多线程-实现 生产者-消费者 模式
    多线程实现生产者消费者,堆积满100后停止生产,消费到小于50后继续生产这是一种写法,但是我觉得不太好:它通过循环创建了很多的线程,每个线程只消费/生产一次它使用notifyAll()通知所有的线程唤醒,包括生产者和消费者,感觉产品数量永远也达不到50publicclassProducerimpleme......
  • Spring3中替换默认拦截器的方法BeanFactoryPostProcessor
    由于Spring默认的静态资源处理器不能满足需求,需要做一些自己的处理,但mvc:resources的标签又挺好用的,不想每次配置静态资源目录的时候,还要特殊指定处理器,也不想修改任何配置代码,于是找到了使用BeanFactoryPostProcessor的方法 实现代码如下:importorg.springframework.beans.Beans......
  • 三类代码协同模式,你要如何选?
    三类代码协同模式,Git大神告诉你到底如何选。Git代码协同模式基础为团队规划研发协同模式之前,有必要了解Git的几种协同模型。其中多种协同模型中使用了代码评审。代码评审在不同的代码平台有不同的称谓。GitHub应该是受到了git命令 gitrequest-pull的启发,将代码......
  • 设计模式——工厂模式
    ★★★原文链接★★★:https://subingwen.cn/design-patterns/factory/工厂模式简单工厂  工厂和对象的关系:一对多工厂模式  工厂和对象的关系:一对一示例:#include<iostream>usingnamespacestd;//产品类的父类-人造恶魔果实父类classAbstractSmile{public: v......