工厂设计模式之see

#include "stdafx.h"

 

class Wall{

public:

    Wall(){

        printf("Wall/n");

    }

};

 

class Room{

public:

    Room(){

        printf("Room/n");

    }

};

 

 

class Door{

public:

    Door(){

        printf("Door/n");

    }

};

 

class MazeGame

{

public:

   virtual  void CreateMaze(){

        MakeWall();

        MakeRoom();

        MakeDoor();

    }

   virtual Wall* MakeWall(){

       //printf("MazeGame_CreateWall!/n");

       return new Wall;

   }

   virtual Room* MakeRoom(){

       //printf("MazeGame_CreateRoom!/n");

       return new Room;

   }

 

   virtual Door* MakeDoor(){

       //printf("MazeGame_CreateRoom!/n");

       return new Door;

   }

};

 

class  EnchantedWall:public Wall{

public:

    EnchantedWall(){

        printf("EnchantedWall/n");

    }

};

 

class  EnchantedRoom:public Room{

public:

    EnchantedRoom(){

        printf("EnchantedRoom/n");

    }

};

 

class EnchantedMazeGame:public MazeGame

{

    Wall* MakeWall(){

        return new EnchantedWall;

    };

 

    Room* MakeRoom(){

        return new EnchantedRoom;

    };

};

 

 

int main(int argc, char* argv[])

{

    printf("The original mazegame!/n");

 

    MazeGame mazegame;

    mazegame.CreateMaze();

 

    printf("/n/nThe enchanted mazegame!/n");

 

    EnchantedMazeGame enchantedmazegame;

    enchantedmazegame.CreateMaze();

 

    return 0;

}

 

 运行结果如下:

 

结论:验证了

1、 在创建子类的对象之前,总是会先遍历调用该子类所有父类的构造函数,然后再调用该子类的构造函数。

2、可以看到 虽然子类中CreateMaze没有被重载,但是由于其内部的一些引用的成员函数(这里是MakeWall()MakeRoom())被子类重载了。在执行子类中的CreateMaze函数时,系统能够自动识别的调用这些子类中的相同函数名的函数。

 

 

这个程序里的工厂模式的意义是:如果需要重新生成一个对象,只需要将最上端的工厂的子类ConcretFactory更改即可。因为其作为工厂类的接口都是一样的。

在实现这些工厂的时候,通过子类的重载抽象类中的生成各种产品Product(部分对象)的函数ConcretProduct,可以更改最终创建的对象,即产品。

 

这里ConreteFactoryConcretProduct可以看到是一个平行的结构?

结构图如下

对照程序我们可以看到

Product                  即为 Wall

ConcreteProduct    即为 EnchantedWall

 

Creator        即为MazeGame   

ConcreteCreator即为EnchantedMazeGame

 

FactoryMethod  即为 return new EnchantedWall

 

通过FactoryMethod将这个生成Product的操作屏蔽。从外观上来看也即使相同的接口,只是不同的工厂MazeGame的不同子类而已。

自己觉得:理解设计模式可能从Client的code形式,然后回溯到设计模式的实现,这条思路来理解会更加清晰一些。

如果本文有什么错误或者有什么好的建议,希望大家能够及时指出,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值