Cocos2d-x3.2与设计模式(一)创建型模式之ABSTRACT FACTORY(抽象工厂)--对象创建型模式

EDSR图像超分辨程序复现(踩坑及解决记录) 阅读详情

   在本篇文章中,我将讲解抽象工厂模式以及结合Cocos2d-x3.2中某些源码来作为实例说明。

   1.模式定义

      在基类中定义一系列只有名称而没有实现的接口,具体实现需要在其子类中定义。或者在基类中定义一系列有名称且有简单实现的接口,具体实现还是需要在其子类中定义。抽象工厂模式可能会用工厂方法(Factory Method)或原型模式(Prototype)模式来实现。也就是说在一种模式的实现中可以应用其他设计模式,所以当你学习时,不能死背一种模式,而应该把多种模式结合起来理解。这会使得我们在平常写代码中能合理利用多种设计模式。

     在C++中实现,通常把接口定义为虚函数,这是为了用父类指针指向子类后能动态执行,这样实现比较灵活。在C++中也可以把接口定义为非虚函数,这样就需要用该类的指针来指向它来执行操作。至于上面所说的只有名称没有实现的接口就是用纯虚函数来实现的。

     下面我就用代码1来说明一下。

      代码1:

class baseFactory
{
  public:
  virtual Type function1(Parameters A) =0;

};
class subclassFactory1:public baseFactory
{
public:
 virtual Type function1(Parameters A)
 {
   具体实现1...
 }
};
class subclassFactory2:public baseFactory
{
public:
 virtual Type function2(Parameters A)
 {
   具体实现2...
 }
};
    为什么在subclassFactory1中的function1也为虚函数,这是因为 subclassFactory1也有可能是其他类的父类,这样方便用父类指针指向子类后能动态执行。

    从代码1我们可以看出,一个基类衍生出了多个子类,并且具体实现是与该子类有关而不是与基类有关。这样我们在编写一个系统时就可以设置一个统一备置,而每个子类就可以自由发挥地实现自己想要实现的效果了。在我们生活中,车就是一个基类,它配置好了参数,然后不同厂商生产不同品牌且性能不同的车。不同品牌的车就是车的子类了,不同厂商可以根据自己喜好来设计生产车。

   2.模式应用场景

      1.一个系统要独立于它的产品的创建、组合和表示时。

      2.一个系统要有多个产品系列中的一个来配置时。

      3.当你要强调一系列的相关的产品对象设计以便进行联合使用时。

      4.当你提供一个产品类库,而只想显示他们的接口而不是实现时。

   3.模式在Cocos2d-x3.2中的应用

      在Cocos2d-x3.2中应用这种模式的大多是xxxProtocol类,这些类声明在...\cocos2d\cocos\base\CCProtocols.h目录下,大家可以去看看。

      那接下来我就以TextureProtocol作为例子来讲解。

      我们先看看TextureProtocal的源码,代码2。

      代码2:

class CC_DLL TextureProtocol : public BlendProtocol
{
public:
    virtual ~TextureProtocol() {}
    virtual Texture2D* getTexture() const = 0;
    virtual void setTexture(Texture2D *texture) = 0;
};
     在代码2中,我们可以看到TextureProtocol继承了BlendProtocol,BlendProtocl的声明如代码3。

     代码3:

class CC_DLL BlendProtocol
{
public:
    virtual ~BlendProtocol() {}
    virtual void setBlendFunc(const BlendFunc &blendFunc) = 0;
    virtual const BlendFunc &getBlendFunc() const = 0;
};
    那我们为什么不以 BlendProtocol来讲解,而是用 TextureProtocol来说明?当我们追寻 BlendProtocol的setBlendFun

c或getBlendFunc的具体在那个些子类中实现时,就会发现这个两个接口只在Sprite类中实现了而没有在其他子类中实现,这太没有代表性。所以我们用TextureProtocol来讲解。

    那么我们现在就追寻TextureProtocol中的setTexture具体在哪些子类实现。在Visual Studio环境下点击右键转到定义,得到的结果如图1。

    图1:

  

    从图1中,我们可以看到Sprite、ParticleSystem、SpriteBatchNode等等都继承了TextureProtocol,并且都按各自需求实现了setTexture接口。这里我们就看到了这种设计模式的优点了,即基类配置参数,子类按照自己需要实现,各个子类的实现相互独立。

    那接下来,我们也就setTexture在Sprite和ParticleSystem中的实现,如代码4和代码5。

    代码4:

void Sprite::setTexture(Texture2D *texture)
{
    // If batchnode, then texture id should be the same
    CCASSERT(! _batchNode || texture->getName() == _batchNode->getTexture()->getName(), "CCSprite: Batched sprites should use the same texture as the batchnode");
    // accept texture==nil as argument
    CCASSERT( !texture || dynamic_cast<Texture2D*>(texture), "setTexture expects a Texture2D. Invalid argument");

    if (texture == nullptr)
    {
        // Gets the texture by key firstly.
        texture = Director::getInstance()->getTextureCache()->getTextureForKey(CC_2x2_WHITE_IMAGE_KEY);

        // If texture wasn't in cache, create it from RAW data.
        if (texture == nullptr)
        {
            Image* image = new Image();
            bool isOK = image->initWithRawData(cc_2x2_white_image, sizeof(cc_2x2_white_image), 2, 2, 8);
            CC_UNUSED_PARAM(isOK);
            CCASSERT(isOK, "The 2x2 empty texture was created unsuccessfully.");

            texture = Director::getInstance()->getTextureCache()->addImage(image, CC_2x2_WHITE_IMAGE_KEY);
            CC_SAFE_RELEASE(image);
        }
    }
    if (!_batchNode && _texture != texture)
    {
        CC_SAFE_RETAIN(texture);
        CC_SAFE_RELEASE(_texture);
        _texture = texture;
        updateBlendFunc();
    }
}
       代码5:
void ParticleSystem::setTexture(Texture2D* var)
{
    if (_texture != var)
    {
        CC_SAFE_RETAIN(var);
        CC_SAFE_RELEASE(_texture);
        _texture = var;
        updateBlendFunc();
    }
}

    从代码4和5中,我们看到了setTexture在各个子类中按需求实现的。

   4.模式结构与参与者

      此模式的结构如图2。

      图2:

                            


     1.AbstractFactory()

       声明一个创建抽象产品对象的操作接口。在这里没有调用Sprite、ParticleSystem的操作接口。

     2.ConcreteFactory()

       实现创建具体产品对象的操作。在这里没有调用Sprite、ParticleSystem的操作。

     3.AbstractProduct(TextureProtocol)

       为一类产品对象声明一个接口。在这里为TextureProtocol。

     4.ConcreteProduct(Sprite、ParticleSystem...)

       定义一个将被相应的具体工厂创建的产品对象。实现AbstractProduct接口。在这里为Sprite、ParticleSystem...。

        5.Client

       仅使用有AbstractFactory和AbstractProduct类声明的接口。

   5.模式的优缺点

      优点:在基类声明同一接口,在不同子类中按照各自需要来实现,分离了具体的类。这使得在调用处可以方便切

                 换到不同的实现类。

      缺点:难于在基类中添加新的接口来支持新的类,因为这需要在每个子类中添加新的接口的定义,代码量大。

      如需转载,请标明出处:http://blog.youkuaiyun.com/cbbbc/article/details/38950569

 

从零开始学习CANoe(六)—— CAPL 测试节点 创建CAPL Test Module的两种方式 阅读详情

相关推荐

提示词工程的几个参数

低 temperature + 低 top-p:输出最稳定、最可靠,适合需要准确性和一致性的场景。高 temperature + 高 top-p:输出最多样化、最富有创意,适合需要灵感和探索的场景。Max Length:您可以通过调整max length来控制大模型生成的 token 数。指定 Max Length 有助于防止大模型生成冗长或不相关的响应并控制成本。是一个字符串,可以阻止模型生成 token,指定是控制大模型响应长度和结构的另一种方法。例如,您可以通过添加 “11” 作为。

weixin_44212787的博客 1826

Java系列(17)——多态

多态 多态就是行为具有表现多种功能的能力。 特点: 1.必须要有继承关系,在抽象类中可以定义多态的抽象方法,通过子类来继承这个抽象类然后复写抽象类中的方法已达到多态的效果。 2.多态子类的实例可以赋给父类引用。 比如父类里的方法在子类中重写时,他们的方法体不一样就是多态(继承多态)。 示例代码: //父类 class Person { String name; ...

魏宇轩 716

DeepSeek+知网研学:三步搞定文献矩阵与对比分析(实战指南)

本文提供了一套高效实用的文献管理分析实战指南,详细介绍了如何结合DeepSeek大模型与知网研学平台,通过三个核心步骤快速完成文献梳理。该方法能自动提炼文献核心要素、生成结构化对比矩阵,并辅助发现研究空白,显著提升学术研究者的文献分析效率与深度。

weixin_29061509的博客 491

cocos2d-js 控件——UIAbstractCheckButton

UIAbstractCheckButton公有属性、方法 /** * 创建一个复选框 * @param backGround 默认状态背景图片 * @param backGroundSelected 选中状态背景图片 * @param cross 选中状态勾选图片 * @param backGroundDisabled 禁...

在代码身上,用心去飞翔 331

【FPGA的基础快速入门23--------OV5640摄像头VGA显示】

FPGA的基础学习--------OV5640摄像头VGA显示OV5640简介二级目录三级目录 OV5640简介 OV5640同OV7725一样,都是Omni Vision(豪威科技)公司生产的CMOS图像传感器。 OV5640支持更高的分辨率(500W像素)、采集速率,具有更高的图像处理性能,主要应用在手机、数码相机、电脑多媒体等领域。 OV5640支持LED补光、MIPI(移动产业处理器接口)输出接口和DVP(数字视频并行)输出接口选择、ISP(图像信号处理)以及AFC (自动聚焦控制)等功能。 OV

暮雨中的坚果的博客 7689

Python新手必看:5分钟搞定睿尔曼机械臂基础控制(附代码示例)

本文为Python新手提供了快速上手睿尔曼机械臂基础控制的实战指南。通过详细的步骤讲解和代码示例,介绍了从环境搭建、网络配置、SDK安装到建立连接、执行关节运动(movej)、直线运动(movel)等核心控制指令的全过程,帮助零基础开发者快速实现机械臂的基础操控。

hp777的博客 328

cocos creator笔记(3)函数和面向对象

函数,面向对象,构造,静态,继承,抽象

qq_36936831的博客 567

CubeMX配置ADC+DMA避坑实战:如何避免采样过快导致的系统崩溃

本文针对STM32开发中常见的ADC采样过快导致程序卡死问题,提供了基于CubeMX的实战避坑指南。通过分析ADC与DMA协作机制,详解时钟配置、采样时间、DMA缓冲区长度及中断设置等关键步骤,帮助开发者从源头规避系统崩溃风险,实现稳定可靠的数据采集。

weixin_28273593的博客 324

abstract类和接口

比较一下两者的语法区别: 1.抽象类可以有构造方法,接口中不能有构造方法。 2.抽象类中可以有普通成员变量,接口中没有普通成员变量 3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。 4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然 eclipse下不报错,但应该也不行),但接口中的抽象方法只能是publ

超帅哥哥的人生巅峰 478

TIA protal与SCL从入门到精通(1)——SCL编程入门

SCL语言是由Pascal而生的结构化程序语言,与梯形图相(LAD)比,SCL语言的灵活程度更高,易于编写控制算法。 本教程基于的平台如下 软件:TIA 15.1 CPU 1516 (1)直接创建纯SCL的程序块儿; (2)在LAD/FBD中在插入SCL程序段。 在程序段中直接右击插入即可,但是插入的程序段并不能完全使用SCL语法,GOTO等跳转指令就不能使用。在SCL中一般不能使用绝对地址进...

苦走一口田 7万+

华为OD机试 - 末世分配资源包 - 二分查找 + 贪心(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。末世时代,政府为各地方配资源,现有资源分配表 nums[n],要求按如下规则分配给 k 个营地:在最优平均分配情况下,得到最大团队所获得的资源数4,3,6,9,7 216最佳划分之一:[4,3,6] -> 13 [9,7] -> 16最大

学Java,找哪吒 223

分析cocos缓存管理的实现

分析cocos缓存管理的实现 今天看了一下cocos的缓存管理类,首先缓存管理类是一个单例对象,获得该对象的实例必须通过导演类Dirctor的Director::getInstance()->getTextureCache();其实这是一种挺不错的架构方式,通过一个在顶部的对象来获得引擎里面你需要的接口,这就屏蔽了实现的细节。题外话了,转入正题。cocos的纹理缓存管理包含了加载图片纹理的接口,

yangzhengqui的专栏 2699

2024年数字IC秋招-海康威视-数字逻辑设计工程师-笔试题

笔试题型:单选 + 多选笔试平台:百一测试(电脑监控)笔试时间:1h30minA. AW通道B. D通道C. B通道D. AR通道return x++;x = 5;y = Foo(x);

qq_42135020的博客 3199

cocos2d-x 源码剖析(15)

上节讲到了cocos2d-x在iOS上解压绝大数的图片格式为CCImage,然后再转化为纹理格式。其中有一个列外就是Webp格式。今天我们来看看Windows上面的情况,Android上的情况和Windows是类似的,都是使用第三方库来解码图片。按照道理来讲,Android上是可以采用类似iOS的技术,使用Android的系统库来解码图片,而且Android在4.0版本上已经开始原生支持Webp格

姚大头 1530

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Cocos2d中的五个重要协议

1. 触摸协议 分别是CCStandarTouchDelegate和CCTargetedTouchDelegate。前面一个协议功能和UIView里面的touch方法一模一样,只是方法名称前加了cc,后面的协议只处理单个触摸,并且可以吞噬触摸。 触摸实现是先被EAGLView接收,然后让CCTouchDispatcher单例处理,dispatcher则统一让实现CCStandarTouchDe

To be continue 1715

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

CCProtocols(各种协议CCRGBAProtocol:函数-透明度是否改变RGB、颜色是否下传。混合协议+CCTextureProtocol+字体协议+导演协议 )

#ifndef __CCPROTOCOLS_H__ #define __CCPROTOCOLS_H__ #include "ccTypes.h" #include "textures/CCTexture2D.h" #include NS_CC_BEGIN /**  * RGBA protocol that affects CCNode's col

sssssNian的专栏 1466

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

9.【cocos2d-x 源码分析】:Texture的详细分析

对应源码位置:cocos2d-x-3.3\cocos\render\CCTexture* 从Sprite谈起 Sprite其实内部必然包含一个纹理图片,但我们写代码时候用到的是传入一个图片路径,从下面看: //直接 传入Texture2D 对象 Sprite* Sprite::createWithTexture(Texture2D *texture) { Sprite *sprite = ...

会飞的徐公明 1493

浅谈cocos2dx(18) 中工厂模式

Cocos2d-x中也有工厂模式,何为工厂模式,顾名思义就是用来产生产品的,工厂就是用来创建其他类对象的类,我们把这个创建其他类对象的类叫做工厂类,而这些被创建的对象叫做产品,所以这种模式才叫做工厂模式,是不是很形象。我们从纯c++的角度来看一下如何使用工厂模式。工厂模式又分为简单工厂模式、工厂方法模式、抽象工厂模式,先来看一下简单工厂模式如何实现。

破茧 1620

cocos2d-x-3.5 中new 出来的对象大部分是如何处理的

以下来自对 cocos2d-x-3.5 的源码分析, 今天重点研究它的动态开辟的对象释放问题.涉及以下3个基本的class 手动引用计数类 class Ref Ref 是 cocos2d 中很大一部分类的祖先类 . Ref 支持以下三个接口: retain() 累加引用计数 , 当我们将指针复制给新的指针的时候, 请自觉手动调用! release() 指针释放无用或者即将挪作它用之前,自己自

郭立东的个人博客 1174

cocos2d-x 源码剖析(14)

今天大老板看我加班辛苦,不由上来教育一番,我等屌丝立马重树三观。后又老爸介绍一相亲对象,虽说无甚期待也足够让想象里驰骋会儿了。心情略好,嗯来一篇吧。为了接上思路,我把前面几章看了一遍。自己水平不够,国语稀烂,新手要看懂确实不容易,老手也没必要看了。哈哈,略显尴尬。看个大概就可以了。 好吧言归正传,自上一篇讲完Touch之后cocos2d-x的主逻辑就没什么类容了。我来整理下: co

姚大头 893

Cocos2d-x中图字原理之深入分析

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 优快云博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地:249941957 加群写:Cocos2d-x 本章为我的Cocos2d-x教程一书初稿。望各位看官多提建议! 首先感谢优快云对本博的支持,最近一周,本博的两篇博文HelloWorld和HelloLua深入分析入选博...

移动开发记录 262

设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)

什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

CC专栏 3157

cocos2d-x游戏开发(九)重要的基类CCNode

欢迎转载:http://blog.csdn.net/fylz1125/article/details/8522523 这个CCNode是个很重要的基类,没有理由不把它搞一搞。 首先看下类结构图: 它几乎是所有类的基类,官方注释如下: CCNode是主要元素。任何一个能被绘制或者包含能被绘制的东西都是一个CCNode。 最常用的CCNode有:CCScene,CCLayer,C...

移动开发记录 224

抽象工厂模式-----对象创建型模式

抽象工厂模式:(详细:http://blog.csdn.net/liruikqn/article/details/12888511) 目的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类型。意思就是通过工厂模式可以获取一个特定的对象,而不了解他是怎么被创建的。 具体说明:抽象工厂模式通常是用于创建一族产品,并且这族产品分不同的等级;不同的具体工厂类生产不同等...

qwuheuhf的博客 124

CCLayer解析

代码: // // Layer // /** @class Layer * @brief Layer is a subclass of Node that implements the TouchEventsDelegate protocol. Layer是Node的一个子类实现了TouchEventsDelegate协议 All features from Node are valid

Freedom! 939

Cocos2d-x高斯模糊

记录在Cocos2dx下使用高斯模糊,可以使用在ui弹框等方面。 大概的思路为获得当前屏幕数据(截图),数据处理(高斯模糊),生成一个image->纹理->精灵 1.截图 可使用Cocos2dx自带的ccUtils::onCaptureScreen获得flippedBuffer void onCaptureScreen(const std::function& afterCaptured,

hello-world 2973
上一篇: Cocos2d-x3.2与设计模式(零)设计模式是什么
下一篇: C++中堆和栈内存分配
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值