设计模式---创建类型---抽象工厂

来源:互联网 发布:大华7016软件 编辑:程序博客网 时间:2024/05/01 05:07
1、意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2、适用性
在以下情况可以使用Abstract Factory模式
1)一个系统要独立于它的产品的创建、组合和表示时。
2)一个系统要由多个产品系列中的一个来配置时。
3)当你要强调一系列相关的产品对象的设计以便进行联合使用时。
4)当你提供一个产品类库,而只想显示它们的接口而不是实现时。
3、C++实例

// Test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <Windows.h>#include <list>#include <string>using namespace std;enum Direction{North = 0,South,East,West};class MapSite{public:virtual void Enter()=0;};// abstract productclass Room: public MapSite{public:Room( int roomNo ){_roomNumber = roomNo;}MapSite* GetSide( Direction d ) const{return _sides[d];}void SetSide( Direction d, MapSite *m ){_sides[d] = m;}virtual void Enter(){}private:MapSite *_sides[4];int _roomNumber;};// productclass RoomWithABomb:public Room{public:RoomWithABomb( int roomNo ): Room( roomNo ){_roomNumber = roomNo;}MapSite* GetSide( Direction d ) const{return _sides[d];}void SetSide( Direction d, MapSite *m ){_sides[d] = m;}virtual void Enter(){}// ......Bombprivate:MapSite *_sides[4];int _roomNumber;// Bomb};// abstract productclass Wall: public MapSite{public:Wall(){}virtual void Enter(){}};// productclass BombedWall: public Wall{public:BombedWall(){}virtual void Enter(){}// ......Bomb};// abstract productclass Door:public MapSite{public:Door( Room* r1 = NULL, Room* r2 = NULL ){_room1 = r1;_room2 = r2;}virtual void Enter(){}Room* OtherSideFrom( Room *r ){return NULL;}private:Room* _room1;Room* _room2;bool _isOpen;};class Maze{public:Maze(){}void AddRoom( Room *r ){_room = r;}Room* RoomNo( int ) const{return NULL;}private:Room *_room;};// abstract factoryclass MazeFactory{public:MazeFactory(){}virtual Maze* MakeMaze() const{return new Maze;}virtual Wall* MakeWall() const{return new Wall;}virtual Room* MakeRoom( int n ) const{return new Room( n );}virtual Door* MakeDoor( Room *r1, Room *r2) const{return new Door( r1, r2 );}};// concrete factoryclass EnchantedMazeFactory:public MazeFactory{public:EnchantedMazeFactory(){}virtual Room* MakeRoom( int n ) const{// enchanted  roomreturn new Room( n );}virtual Door* MakeDoor( Room *r1, Room *r2) const{// enchanted  doorreturn new Door( r1, r2 );}};// concrete factoryclass BombedMazeFactory:public MazeFactory{public:BombedMazeFactory(){}virtual Room* MakeRoom( int n ) const{return new RoomWithABomb( n );}virtual Wall* MakeWall() const{return new BombedWall;}};class MazeGame{public:MazeGame(  ){}Maze* CreateMaze( MazeFactory &factory ){Maze* aMaze = factory.MakeMaze();Room* r1 = factory.MakeRoom( 1 );Room* r2 = factory.MakeRoom( 2 );Door* aDoor = factory.MakeDoor( r1, r2 );aMaze->AddRoom( r1 );aMaze->AddRoom( r2 );r1->SetSide( North, factory.MakeWall() );r1->SetSide( East, aDoor );r1->SetSide( South, factory.MakeWall() );r1->SetSide( West, factory.MakeWall() );r2->SetSide( North, factory.MakeWall() );r2->SetSide( East, factory.MakeWall() );r2->SetSide( South, factory.MakeWall() );r2->SetSide( West, aDoor );return aMaze;}};int _tmain(int argc, _TCHAR* argv[]){MazeGame game;BombedMazeFactory factory;game.CreateMaze( factory );return 0;}


0 0
原创粉丝点击