You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

原型设计模式中_landSatImage是否用于注册子类?具体如何实现?

原型模式中_landSatImage静态变量的子类注册逻辑拆解

这个静态变量的核心作用是利用C++静态对象的初始化机制,自动完成子类原型的注册,无需手动调用注册函数,具体流程如下:

1. 静态变量的声明与初始化时机

在LandSatImage类的私有域中声明静态成员:

static LandSatImage _landSatImage;

随后在类外部定义并初始化该静态变量:

LandSatImage LandSatImage::_landSatImage;

C++规定,全局/类静态对象会在**main函数执行前**完成初始化,这是整个注册流程的触发起点。

2. 触发私有默认构造函数

初始化_landSatImage时,会调用LandSatImage的私有默认构造函数:

LandSatImage()
{
    addPrototype(this); 
}

私有构造函数仅能被类自身的静态成员访问(静态成员属于类作用域,不受访问权限限制),避免外部随意创建原型实例,保证原型的唯一性。

3. 完成原型注册

构造函数中调用的addPrototype(this)是父类Image的静态保护方法:

static void addPrototype(Image *image) 
{
    _prototypes[_nextSlot++] = image;  
}

这里的this指向刚初始化的_landSatImage对象(即LandSatImage的原型实例),父类会将该实例指针存入_prototypes数组,同时更新_nextSlot索引,完成LandSatImage原型的注册。

4. 原型的使用逻辑

当客户端调用Image::findAndClone(imageType type)时,会遍历_prototypes数组,找到对应类型的原型实例,调用其clone方法创建新对象:

Image *LandSatImage::clone()
{
    return new LandSatImage(1); 
}

带参数的构造函数为保护权限,仅能被clone方法调用,用于生成带有唯一_id的新实例,避免原型实例的状态被意外修改。

同类逻辑对比:SpotImage的_spotImage

SpotImage中的_spotImage静态变量遵循完全相同的逻辑:静态初始化触发私有构造函数,调用addPrototype完成注册,最终通过clone生成实例。

这种设计的优势在于:新增Image子类时,只需添加类似的静态变量和构造函数,就能自动完成原型注册,符合开闭原则。

内容的提问来源于stack exchange,提问作者pengfei_guo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:55:22