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

本文介绍抽象工厂模式的概念及其应用场景,并通过C++代码示例详细解释如何实现该模式。适用于希望了解设计模式中抽象工厂模式原理及实践的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 product
class 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;
};


// product
class 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()
	{

	}

	// ......Bomb

private:

	MapSite *_sides[4];

	int _roomNumber;

	// Bomb
};

// abstract product
class Wall: public MapSite
{
	
public:

	Wall()
	{

	}

	virtual void Enter()
	{

	}
};

// product
class BombedWall: public Wall
{

public:

	BombedWall()
	{

	}

	virtual void Enter()
	{

	}

	// ......Bomb
};

// abstract product
class 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 factory
class 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 factory
class EnchantedMazeFactory:public MazeFactory
{

public:

	EnchantedMazeFactory()
	{

	}

	
	virtual Room* MakeRoom( int n ) const
	{
		// enchanted  room
		return new Room( n );
	}

	virtual Door* MakeDoor( Room *r1, Room *r2) const
	{
		// enchanted  door
		return new Door( r1, r2 );
	}
};

// concrete factory
class 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值