`
kmplayer
  • 浏览: 508847 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式之虚构造函数模式

阅读更多
1,虚构造函数模式:"现在还不知道需要什么类型的对象,但是有一些信息,请创建适当的对象."
2,实例代码:
#include <iostream>
#include <stdexcept>
#include <vector>
using namespace std;

class Shape
{
    Shape* s;
    Shape(const Shape&);
    Shape operator=(Shape&);
//禁止构造对象
//这里只给派生类动态创建时使用.
protected:
    Shape(){ s=0; }//注:"信封"中s指向实际对象.
    //"信件"中,s只是一个负荷,这里默认构造函数为"信件"将s赋值为0
public:
    virtual void draw(){ s->draw(); };
    virtual ~Shape() //这里将被调用两次
    //第一次派生类s!=0;
    //第二次,基类,此时s==0,delete s无操作.
    {
        cout<<"~Shape"<<endl;
        delete s;//注:delete 0合法,等价于无操作
    }
    class shape_error : public logic_error
    {
    public:
        shape_error(string type):logic_error("Cann't create shape: "+type){}
    };
    Shape(string type) throw(shape_error);
};

class Circle : public Shape
{
    Circle(){}//构造函数设为私有,只创建基类
    Circle(const Circle&);
    Circle operator=(Circle&);
    friend class Shape;
public:
    void draw(){ cout<<"Circle:Draw"<<endl; }
    ~Circle(){ cout<<"Circle:~Circle"<<endl; }
};

class Square : public Shape
{
    Square(){}//构造函数设为私有,只创建基类
    Square(const Square&);
    Square operator=(Square&);
    friend class Shape;
public:
    void draw(){ cout<<"Square:Draw"<<endl; }
    ~Square(){ cout<<"Square:~Square"<<endl; }
};

//核心
Shape::Shape(string type) throw(Shape::shape_error)
{
    if(type=="Circle")
        s=new Circle;
    else if(type=="Square")
        s=new Square;
    else throw shape_error(type);
}

char* sl[] = { "Circle", "Square", "Square", "Circle", "Circle", "Circle", "Square" };
int main()
{
    vector<Shape*> shapes;
    try
    {
        for(size_t i = 0; i < sizeof sl / sizeof sl[0]; i++)
            shapes.push_back(new Shape(sl[i]));//这里虚指针都是指向Shape的一个对象.
    } catch(Shape::shape_error& e)
    {
        cout << e.what() << endl;
        for(vector<Shape*>::iterator ite=shapes.begin();ite!=shapes.end();ite++)
        {
            delete *ite;
        }
        return EXIT_FAILURE;
    }
    for(size_t i = 0; i < shapes.size(); i++)
    {
        shapes[i]->draw();
    }
    //关于析构函数:从Shape的析构函数入口,第一次执行delete s,先派生类析构,然后基类析构,又一次执行delete s
    //此时派生类的s=0,不产生任何操作.
    for(vector<Shape*>::iterator ite=shapes.begin();ite!=shapes.end();ite++)
    {
        delete *ite;
        cout<<endl;
    }
    return 0;
}
分享到:
评论

相关推荐

    工厂接口虚函数抽象函数单例DEMO

    单例可以通过私有构造函数和静态方法来实现,以防止多实例化。 结合这些概念,DEMO可能会展示如何在ASP.NET C#项目中创建一个工厂类来生成产品对象,这些对象可能是基于抽象类的,允许在子类中实现具体逻辑。同时,...

    xuhanshu.rar_C++虚函数_虚函数

    这是多态性的基础,也是设计模式如工厂模式、策略模式等的关键。 3. **基类指针操作子类对象**:虚函数使得我们可以使用基类指针或引用来操作子类对象,实现向上转型。例如: ```cpp class Derived : public Base ...

    极客班C++设计模式课件资料.zip

    在C++中,设计模式的实现往往结合了语言特性,如虚函数、模板和多重继承等。例如,单例模式利用静态成员和私有构造函数确保类只有一个实例;工厂方法模式通过抽象工厂接口,让子类决定实例化哪个类;装饰器模式则...

    C++箴言:避免析构函数调用虚函数

    在C++编程中,理解和遵循良好的设计模式对于确保程序的稳定性和可维护性至关重要。其中一个经常被提及的原则是“避免在析构函数中调用虚函数”。这一原则在C++语言中尤为重要,因为它涉及到虚函数系统的本质以及类...

    headfirst设计模式C++代码实现

    C++可以通过静态成员变量和私有构造函数来实现单例。工厂模式则用于创建对象,通过工厂方法将对象的创建过程封装起来,使得创建过程与具体类解耦。 装饰器模式允许在运行时动态地给对象添加新的行为或职责,它通过...

    C/C++设计模式

    原型模式通过复制现有的实例来创建新对象,而不是通过构造函数创建。在C语言中,可以利用内存拷贝函数如`memcpy`来实现原型模式。 **组合模式** 组合模式允许用户将对象组织成树形结构以表示“部分-整体”的层次...

    C# 设计模式(用常用的设计模式编写C#程序)

    C#中可以使用多个构造函数或工厂方法来实现建造者模式。 十一、模板方法模式 模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。C#中的抽象类和虚方法是实现该模式的基础。 十二、状态模式 状态...

    设计模式C++版

    例如,单例模式通常结合静态成员函数和私有构造函数来确保类只有一个实例;工厂模式则利用虚函数和动态绑定来创建对象;而策略模式则通过接口或抽象基类定义行为,具体策略由派生类实现。 源码部分提供了每种模式的...

    c sharp设计模式c sharp设计模式c sharp设计模式

    理解并熟练运用这些设计模式,有助于提高代码的可读性、可维护性和复用性,也是成为优秀C#开发者的必备技能之一。在实际开发中,可以根据项目需求灵活选择和组合不同的设计模式,以达到最佳的解决方案。

    c++23种设计模式

    C++中,建造者模式可以使用构造函数链或者独立的建造者类来实现。 5. 代理模式:为其他对象提供一种代理以控制对这个对象的访问。C++中的代理可以通过封装原对象的指针来实现,提供额外的功能或控制。 6. 模板方法...

    Head First设计模式 C++代码实现

    在C++中,可以通过静态成员变量和私有构造函数来实现。 2. **工厂模式**:提供一个接口创建对象,但让子类决定实例化哪个类。C++中的工厂模式可以利用抽象基类和多态性来实现。 3. **抽象工厂模式**:为创建一组...

    设计模式-可复用面向对象软件的基础(中英文+src code)

    例如,单例模式可能会利用静态成员和私有构造函数;工厂模式则通过虚函数和多态实现动态对象创建。源代码部分,如“设计模式(C++)源代码 一雨田”,将提供具体的C++实现示例,帮助读者更好地理解和应用这些模式。 ...

    设计模式教程(C++实现)

    C++中,可以利用构造函数链和对象组装来实现。 5. **观察者模式**:定义对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。C++中可以使用信号槽机制或STL中的...

    设计模式C++教程

    例如,模板可以用来实现通用的工厂模式,而虚函数和继承则是实现许多设计模式的基础。此外,C++11及以后的版本引入了诸如lambda表达式和智能指针等新特性,这些都进一步丰富了设计模式的应用场景。 在“设计模式C++...

    Csharp设计模式

    在C#中,通常通过私有构造函数和静态方法实现,例如使用`Lazy&lt;T&gt;`类或双检锁(Double-Check Locking)模式。 2. 工厂模式:提供一个创建对象的接口,但让子类决定实例化哪个类。C#中的抽象工厂可以创建一系列相关的...

    陈利娥系列之_设计模式-设计模式在C#中的初步应用.ppt

    设计模式是软件开发中的一种重要概念,它代表了在特定情境下解决常见问题的最佳...因此,理解和恰当使用设计模式是每个C#开发者必备的技能之一。通过深入学习和实践,开发者能够更好地构建高质量、可扩展的软件系统。

    C#设计模式详细介绍

    原型模式是一种创建型设计模式,它允许通过复制已有对象来创建新对象,而不是通过传统的构造函数方式。在C#中,可以利用`ICloneable`接口或者`MemberwiseClone`方法实现对象的克隆。 **9. 模板方法模式** 模板方法...

    C#设计模式(23种设计模式)

    在软件开发过程中,设计模式是一种被广泛采用的实践方法,它可以帮助开发者解决常见的设计问题,并提高代码的可重用性和可维护性。本篇文章将详细介绍23种C#设计模式,分为创建型、结构型和行为型三类。 ### 创建型...

    c++20设计模式-第4章-原型模式代码

    4. **拷贝构造函数与赋值运算符**:虽然原型模式通常需要实现`clone()`方法,但在C++中,正确的拷贝构造函数和赋值运算符也是很重要的。它们确保了对象正确地复制,特别是对于含有动态分配内存的对象。 5. **C++20...

Global site tag (gtag.js) - Google Analytics