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

一普通工厂模式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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 前端开发中常用的几种设计模式有哪些_设计模式原理

    前端开发中常用的几种设计模式有哪些_设计模式原理设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论,而不是现成的代码,当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解决的问题,毕竟这是前人无数经验总结成的最佳实践,而代码实现则是对加深理解的辅助。设计模式可以分为三大类:结构型模式(StructuralPatterns):通过识别系统中组件间的简单关系来简化系统的设计。 创建型模式(CreationalPatterns):处理对象的创..

    2025年7月28日
    1
  • 桥模式设计模式进入Bridge

    桥模式设计模式进入Bridge

    2022年1月2日
    60
  • JavaScript设计模式—-策略模式[通俗易懂]

    JavaScript设计模式—-策略模式[通俗易懂]声明:这个系列为阅读《JavaScript设计模式与开发实践》—-曾探@著一书的读书笔记1.策略模式的定义将不变的部分和变化的部分隔开是每个设计模式的主题。定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。2.策略模式的目的将算法的使用与算法的实现分离开来。3.传统语言中的策略模式和JavaScript中的策略模式对比3.1.传统语言中的策略模式使用策略模式来实现计算奖金v

    2022年7月12日
    16
  • 设计模式-单例模式(Singleton)

    设计模式-单例模式(Singleton)

    2021年8月22日
    53
  • 十四、迭代器模式—— 一个一个的遍历 #和设计模式一起旅行#「建议收藏」

    套路要深…故事背景今天要介绍一下迭代器,首先简单说明一下,什么是迭代器,为什么要使用迭代器。 迭代器(Iterate) 的意思就是反复做某件事情。那为什么要反复做某件事情呢,比如我们有个容器里面装了很好东西(这些东西都是同一类型的),要从容器中取每一个东西出来,就要反复去做一个取出的事情。故事主角迭代器模式 : 提供一种方法顺序访问一个聚合对象中的各个元素,而…

    2022年2月27日
    38
  • .NET设计模式访问者模式

    一.访问者模式的定义:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。二.访问者模式的结构和角色:1.Visitor抽象访问者角色,为该

    2021年12月24日
    42

发表回复

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

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