原型设计模式中_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

