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

一普通工厂模式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月19日 下午11:00
下一篇 2021年12月20日 上午12:43


相关推荐

  • 【Java萌新】面试常问设计模式——工厂模式

    【Java萌新】面试常问设计模式——工厂模式临近秋招 备战暑期实习 祝大家每天进步亿点点 Day17 本篇总结的是工厂设计模式 后续会每日更新 1 工厂模式简介 模式介绍 它提供了 种创建对象的最佳 式 在创建对象时不会对客户端暴露创建逻辑 并且是通过使 个共同的接 来指向新创建的对象 例 产电脑 除了 A 品牌 还可以 产 B C D 品牌电脑 业务开发中 付很常 有统 下单和 付接 具体的 付实现可以微信 付宝 银 卡等 模式有 3 种不同的实现 式 简单 模式 静态工厂 通过

    2026年3月16日
    2
  • Java常用设计模式

    Java常用设计模式一、设计模式概念1、定义​Java包含23种设计模式,是一套对代码设计经验的总结,被人们反复利用,多人熟知的代码设计方式。2、目的​为了提高代码的可读性,可扩展性以及代码的复用性,为了解决在写代码过程中遇到的代码设计问题。3、设计模式的六大原则​3.1开闭原则​对扩展开放,对修改关闭(尽可能对代码少修改)​3.2里氏替换原则​它是面向对象基本原则之一,任何父类(基类)出现的地方,子类都可以出现,也就是子类可以替换父类的任何功能(体现了父类的可扩展性)3.3依赖

    2022年7月8日
    25
  • 设计模式-工厂模式

    设计模式-工厂模式

    2021年5月25日
    126
  • 设计模式(三)建造者模式Builder(创建型)

    设计模式(三)建造者模式Builder(创建型)设计模式 三 建造者模 Builder http blog csdn net hguisu article details 1 概述在软件开发的过程中 当遇到一个 复杂的对象 的创建工作 该对象由一定各个部分的子对象用一定的算法构成 由于需求的变化 复杂对象的各个部分经常面临剧烈的变化 但将它们组合在一起的算法相对稳定 例子 1 买肯德基

    2026年3月19日
    3
  • JAVA设计模式之抽象工厂模式

    本文属于23种设计模式系列。继续前面简单工厂模式和工厂方法模式的例子,以汽车配件制造介绍抽象工厂模式。

    2022年3月11日
    42
  • 设计模式:一目了然的状态机图

    设计模式:一目了然的状态机图从第一次认识到状态机这个概念 程序设计似乎就从未离开过它 通过广大网友的技术分享 本文对状态机再做一次总结 了解什么是状态机图 它的使用场景是什么 一 什么是状态机 做产品的时候 我们总能遇到一些比较复杂的逻辑问题 而普通的流程图 或时序图对于对象和状态的解读缺乏直观的描述 这里我们推荐使用简单的状态图来对逻辑问题进行描述 有限状态机 英语 Finite statemac

    2026年3月26日
    2

发表回复

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

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