设计模式之工厂模式建议收藏

一普通工厂模式1.类图2.代码实现#pragmaonce#include<iostream>usingnamespacestd;//抽象渲染类classIR

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

工厂模式是一个创建型的设计模式它允许创造对象时不指定要创建的对象的具体类型。本质上工厂模式是构造函数的一般化。但工厂模式又绕开了构造模式的所有限制,从基本层面来看,工厂模式仅仅是一个普通的方法调用,该调用返回类的实例,它们经常和继承一起使用,即派生类能够重写工厂方法并返回类的实例,常见的做法是使用抽象基类实现工厂模式。

一 普通工厂模式

1. 类图

  设计模式之工厂模式建议收藏

2. 代码实现

设计模式之工厂模式建议收藏
设计模式之工厂模式建议收藏

#pragma once
#include <iostream>
using namespace std;

// 抽象渲染类
class IRenderer
{
public:
    IRenderer()
    {
        cout << "IRenderer Construct" << endl;
    }
    virtual ~IRenderer()
    {
        cout << "IRenderer Deconstruct" << endl;
    }

    virtual void Render() = 0;
};

// Opengl渲染类
class COpenglRenderer : public IRenderer
{
public:
    COpenglRenderer()
    {
        cout << "COpenglRenderer Construct" << endl;
    }
    ~COpenglRenderer()
    {
        cout << "COpenglRenderer Deconstruct" << endl;
    }

    void Render()
    {
        cout << "COpenglRenderer Render" << endl;
    }
};

// DirectX渲染类
class CDirectxRenderer : public IRenderer
{
public:
    CDirectxRenderer()
    {
        cout << "CDirectxRenderer Construct" << endl;
    }
    ~CDirectxRenderer()
    {
        cout << "CDirectxRenderer Deconstruct" << endl;
    }

    void Render()
    {
        cout << "CDirectxRenderer Render" << endl;
    }
};

// 渲染器的抽象工厂类
class CRendererFactory
{
public:
    CRendererFactory(void)
    {
        cout << "CRendererFactory Construct" << endl;
    }
    ~CRendererFactory(void)
    {
        cout << "CRendererFactory Deconstruct" << endl;
    }

    IRenderer* CreateRenderer(const char *RenderType)
    {
        if (0 == strcmp(RenderType, "Opengl"))
        {
            return new COpenglRenderer();
        }
        else if (0 == strcmp(RenderType,"Directx"))
        {
            return new CDirectxRenderer();
        }
    }
};

RendererFactory.h

设计模式之工厂模式建议收藏
设计模式之工厂模式建议收藏

#include "stdio.h"
#include "RendererFactory.h"

a

void main()
{
    CRendererFactory *pFactory = new CRendererFactory();
    IRenderer *pRenderer = pFactory->CreateRenderer("Opengl");
    pRenderer->Render();

    delete pRenderer;
    delete pFactory;
    return;
}

main.cpp

3. 测试

设计模式之工厂模式建议收藏

二 扩展工厂模式

  上面的普通工厂模式演示了一个完全可行的工厂方法,但它存在一个潜在的缺陷就是若每次要添加一个Renderer类就必须在CRendererFactory类中添加相应判断创建的代码,虽然这个改动不是非常繁重,但这意味着不能为新的派生类添加运行时支持,换句话说,用户不能为系统添加新的渲染器,该问题可以使用下面的扩展工厂模式解决。

1. 扩展思想

  (1) 工厂类维护一个映射,此映射将类型名与创建对象的回调关联起来

  (2)允许新的派生类通过一对新的方法调用来实现注册和注销

  (3)运行时注册新类的能力,允许工厂方法模式为API创建可扩展的插件接口

  (4)工厂对象必须保持其状态信息,最好强制要求任意时刻只能创建一个工厂对象,将工厂类实现为单例模式

2. 类图

  设计模式之工厂模式建议收藏

3. 代码实现

设计模式之工厂模式建议收藏
设计模式之工厂模式建议收藏

#pragma once
#include <iostream>
#include <map>
using namespace std;

// 抽象渲染类
class IRenderer
{
public:
    IRenderer()
    {
        cout << "IRenderer Construct" << endl;
    }
    virtual ~IRenderer()
    {
        cout << "IRenderer Deconstruct" << endl;
    }

    virtual void Render() = 0;
};

// Opengl渲染类
class COpenglRenderer : public IRenderer
{
public:
    COpenglRenderer()
    {
        cout << "COpenglRenderer Construct" << endl;
    }
    ~COpenglRenderer()
    {
        cout << "COpenglRenderer Deconstruct" << endl;
    }

    void Render()
    {
        cout << "COpenglRenderer Render" << endl;
    }

    static IRenderer* Create()
    {
        return new COpenglRenderer();
    }
};

// DirectX渲染类
class CDirectxRenderer : public IRenderer
{
public:
    CDirectxRenderer()
    {
        cout << "CDirectxRenderer Construct" << endl;
    }
    ~CDirectxRenderer()
    {
        cout << "CDirectxRenderer Deconstruct" << endl;
    }

    void Render()
    {
        cout << "CDirectxRenderer Render" << endl;
    }

    static IRenderer* Create()
    {
        return new CDirectxRenderer();
    }
};

// 渲染器的抽象工厂类
class CRendererFactory
{
private: 
    CRendererFactory(void);
    ~CRendererFactory(void);

private:
    typedef IRenderer* (*CreateCallBack)();

public:
    static CRendererFactory* RendererFactoryInstance();
    static void RegisterRenderer(const char *cRenderType, CreateCallBack cb);
    static void UnregisterRenderer(const char *cRenderType);
    static IRenderer* CreateRenderer(const char *cRenderType);

private:
    typedef map<const char *, CreateCallBack> CREATECALLBACKMAP; 
    static CREATECALLBACKMAP m_CreateCallBackMap;
    static CRendererFactory *m_pRendererFactory;
};

RendererFactory.h

设计模式之工厂模式建议收藏
设计模式之工厂模式建议收藏

#include "RendererFactory.h"

CRendererFactory* CRendererFactory::m_pRendererFactory = NULL;
CRendererFactory::CREATECALLBACKMAP CRendererFactory::m_CreateCallBackMap;

CRendererFactory::CRendererFactory( void )
{
    cout << "CRendererFactory Construct" << endl;
}

CRendererFactory::~CRendererFactory( void )
{
    cout << "CRendererFactory Deconstruct" << endl;
}

CRendererFactory* CRendererFactory::RendererFactoryInstance()
{
    if (m_pRendererFactory == NULL)
    {
        m_pRendererFactory = new CRendererFactory();
    }

    return m_pRendererFactory;
}

void CRendererFactory::RegisterRenderer( const char *cRenderType, CreateCallBack cb )
{
    m_CreateCallBackMap[cRenderType] = cb;
}

void CRendererFactory::UnregisterRenderer( const char *cRenderType )
{
    m_CreateCallBackMap.erase(cRenderType);
}

IRenderer* CRendererFactory::CreateRenderer( const char *cRenderType )
{
    CREATECALLBACKMAP::iterator iter = m_CreateCallBackMap.find(cRenderType);

    if (iter != m_CreateCallBackMap.end())
    {
        return iter->second();
    }

    return NULL;
}

RendererFactory.cpp

设计模式之工厂模式建议收藏
设计模式之工厂模式建议收藏

#include "stdio.h"
#include "RendererFactory.h"

void main()
{
    CRendererFactory *pFactory = CRendererFactory::RendererFactoryInstance();
    pFactory->RegisterRenderer("Opengl", COpenglRenderer::Create);
    IRenderer *pRenderer = pFactory->CreateRenderer("Opengl");
    pRenderer->Render();
    delete pRenderer;
    pFactory->UnregisterRenderer("Opengl");

    return;
}

main.cpp

4. 测试

 设计模式之工厂模式建议收藏

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120143.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 设计模式之职责链模式

    相信大家都玩过类似于“斗地主”的纸牌游戏,某人出牌给他的下家,下家看看手中的牌,如果要不起,则将出牌请求转发给他的下家,其下家再进行判断。一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新

    2021年12月28日
    63
  • 设计模式——门面模式「建议收藏」

    设计模式——门面模式「建议收藏」今天我们继续来学习前面没有学完的结构型设计模式中的一种:门面模式。门面模式也是一种不太常用的设计模式。所以,我们今天依旧是了解为主,暂时不去深入的学习。概述门面模式:(FacadeDesignPattern)门面模式也叫外观模式,门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。门面模式原理和实现也比较简单,应用场景也比较明确,主要在接口设计方面使用。何时使用:解决易用性问题。解决性能问题。解决分布式事务问题。UML类图:角色组成:门面角色:客户端调用这个

    2025年6月6日
    5
  • Java设计模式菜鸟系列(九)外观模式建模与实现

    Java设计模式菜鸟系列(九)外观模式建模与实现

    2022年1月25日
    54
  • mvc的各个部分都有哪些技术实现_计算机植入木马程序

    mvc的各个部分都有哪些技术实现_计算机植入木马程序MVC三个基本部分:模型(Model)、视图(View)和控制器(Controller)Model:负责业务对象与数据库的映射(ORM)View:负责与用户的交互Controller:接受用户的输入调用模型和视图完成用户的请求MVTDjango框架的MTV设计模式借鉴了MVC框架的思想,三部分为:Model、Template和ViewModel(模型):负责业务对象与数据库的对象(…

    2025年6月12日
    7
  • 三、设计模式介绍—她是谁,我们要去哪里? #和设计模式一起旅行#

    模式模式(Pattern),指事物的标准样式,百度百科上面说的,其实说白了模式就是我们现在说的套路!模式 == 套路模式是一种思想,说大了特别的复杂和深奥,不管怎么样模式的使用可以解决特定场景下特定的问题!准确表达:模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。软件模式那么在软件中使用模式,就是软件模式(Software Pattern),用…

    2022年2月27日
    38
  • 【Java设计模式】——工厂模式

    【Java设计模式】——工厂模式在 Java 应用程序中对象无处不在 这些对象都需要进行创建 如果创建的时候直接 new 对象 那么如果我们要更换对象 所有 new 对象的地方都需要进行更改 违背了软件设计原则中的开闭原则 如果我们使用工厂生产对象 只需要在工厂中关注对象的改变即可 达到了与对象解耦的目的 工厂模式最大的特点就是解耦合 本文将介绍工厂模式的四种实现方式

    2026年1月14日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号