第27课.二阶构造模式

1.构造函数遇到的问题

a.构造函数只提供自动初始化成员变量的机会
b.不能保证初始化逻辑一定成功(涉及到内存容易出错)
c.执行return语句后构造函数立即结束

注:构造函数能决定的只是对象的初始状态,而不是对象的诞生

2.半成品对象

半成品对象:初始化操作不能按照预期完成而得到的对象(即初始化只做了一部分,或者失败)。
半成品对象是合法的,但是它确实bug的一个来源。

3.二阶构造

工程开发中的构造过程可分为两部分
a.资源无关的初始化操作(不可能出现异常情况的操作)
b.需要使用系统资源的操作(可能出现异常情况,如:内存申请(失败),访问文件(失败))

二阶构造示例:

class TwoPhaseCons
{
private:            //私有,不能被**外界**调用
    TwoPhaseCons()          //第一阶段构造函数
    {
    }       

    bool construct()        //第二阶段构造函数
    {
        return true;
    }
    
public:
    static TwoPhaseCons* NewInstance();     //对象创建函数
};

TwoPhaseCons* TwoPhaseCons::NewInstance()
{
    TwoPhaseCons* ret = new TwoPhaseCons();  //静态成员函数怎么能直接调用成员函数呢?
                            
                             //这里的情况是这样的这里调用了构造函数,而构造函数不是普通的成员函数。
                             //理论上来说,这里应该生成一个临时对象,这样也就说的通了
                             /*    eg:
                                对于_instance = new MazeFactory这句,编译器做了如下扩展
                                _instance = operator new Mazefactory;//分配内存
                                _instance->Mazefactory::Mazefactroy();//调用构造函数,
                                可以看到此处构造函数是可以得到this指针

                                所以,只要有对象的this指针,在静态函数中是可以调用非静态函数的
                               */
    //若第二阶段构造失败,返回NULL
    if(!(ret && ret->construct()))
    {
        delete ret;
        ret = NULL;
    }
    
    return ret;
}

eg:

#include <stdio.h>

class TwoPhaseCons
{
private:
    TwoPhaseCons()              //
    {
    
    }
    
    bool construct()            //
    {
        return true;
    }
    
public:
    static TwoPhaseCons* NewInstance();     //
};

TwoPhaseCons* TwoPhaseCons::NewInstance()
{
    TwoPhaseCons* ret = new TwoPhaseCons();
    
    if(!(ret && ret->construct()))
    {
        delete ret;
        ret = NULL;
    }
    
    return ret;
}

int main()
{
    TwoPhaseCons* obj = TwoPhaseCons::NewInstance();
    
    printf("obj = %p
", obj);

    delete obj;
    
    return 0;
}

原文地址:https://www.cnblogs.com/huangdengtao/p/11851074.html