设计模式笔记--创建型模式之一 抽象工厂
来源:互联网 发布:淘宝 在异地 被起诉 编辑:程序博客网 时间:2024/05/22 02:23
抽象工厂模式:
Abstract Factory
适用性:
1一个系统要独立于它的产品的创建,组合和表示时
2一个系统要由多个产品系列中的一个来配置时
3强调一系列相关的产品对象的设计以便进行联合使用时
4提供一个产品类库,而只想显示他们的接口而不是实现时
效果
1分离了具体的类,工厂封装创建产品对象的责任和过程,将客户与类的实现分离。
2使得易于交换产品系列,一个具体工厂类只出现一次。只需改变具体的工厂即可以使用不同的产品配置
3有利于产品的一致性
4难以支持新种类中的产品,Abstract Factory接口确定了可以被创建的产品集合
实现:
1将工厂作为单件,工厂通常最好实现为一个Singleton
2创建产品 为每个产品定义一个具体的工厂方法
3定义可扩展的工厂 更灵活但不安全的方法是给创建对象的操作增加一个参数,来制定创建对象的种类
以下是根据书本practice的代码实现。
Mapsite.h
- #include <string>
- enum Direction {North,South,East,West,Length};
- class Mapsite
- {
- public:
- Mapsite(){}
- virtual ~Mapsite(){}
- virtual void Enter() = 0;
- };
- class Room : public Mapsite
- {
- public:
- Room(int roomNo);
- Mapsite* GetSide(Direction) const;
- void SetSide(Direction,Mapsite*);
- virtual void Enter();
- private:
- Mapsite* _sides[4];
- int roomNumber;
- };
- class EnchantedRoom: public Room
- {
- public:
- EnchantedRoom(int roomNo);
- };
- class Wall:public Mapsite
- {
- public:
- Wall();
- virtual void Enter();
- };
- class Door:public Mapsite
- {
- public:
- Door(Room* = 0,Room* = 0);
- virtual void Enter();
- Room * OtherSideFrom(Room*);
- private:
- Room* _room1;
- Room* _room2;
- bool _isOpen;
- };
- class EnchantedDoor:public Door
- {
- public:
- EnchantedDoor(EnchantedRoom* =0,EnchantedRoom* =0);
- };
- class Maze {
- public:
- //Maze();
- void AddRoom(Room *);
- Room* RoomNo(int) const;
- };
- class MazeFactory //Abstract Factory
- {
- 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);}
- };
- class EnchantedMazeFactory:public MazeFactory
- {
- public:
- EnchantedMazeFactory();
- virtual Room* MakeRoom(int n ) const
- {return new EnchantedRoom(n);}
- virtual Door* MakeDoor(EnchantedRoom* r1,EnchantedRoom* r2) const
- {return new EnchantedDoor(r1,r2);}
- };
- class MazeGame
- {
- public:
- Maze* CreateMaze(MazeFactory& factory);
- };
MapSite.cpp
- #include "MapSite.h"
- #include <iostream>
- using namespace std;
- string Direstr[Length] ={
- "North",
- "South",
- "East",
- "West"
- };
- Room::Room(int roomNo)
- {
- cout<<"Make "<<roomNo<<" room"<<endl;
- }
- EnchantedRoom::EnchantedRoom(int roomNo):Room(roomNo)
- {
- cout<<"Make "<<roomNo<<" enchantedroom"<<endl;
- }
- void Room::SetSide(Direction dire,Mapsite* map)
- {
- cout<<"Build a Wall on Direction "<<Direstr[dire]<<endl;
- }
- void Room::Enter()
- {
- cout<<"Room enter"<<endl;
- }
- Wall::Wall()
- {
- cout<<"Make a wall"<<endl;
- }
- void Wall::Enter()
- {
- cout<<"Wall enter"<<endl;
- }
- void Door::Enter()
- {
- cout<<"Door enter"<<endl;
- }
- void Maze::AddRoom(Room *r)
- {
- cout<<"Add room to the maze!"<<endl;
- }
- Door::Door(Room* r1,Room* r2)
- {
- cout<<"A door is installed between 2 rooms"<<endl;
- }
- EnchantedDoor::EnchantedDoor(EnchantedRoom* r1,EnchantedRoom* r2)
- {
- cout<<"A enchanteddoor is installed between 2 enchantedrooms"<<endl;
- }
- EnchantedMazeFactory::EnchantedMazeFactory()
- {
- cout<<"A enchantedMazeFactory is created"<<endl;
- }
- Maze* MazeGame::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());
- r2->SetSide(East, factory.MakeWall());
- return aMaze;
- }
main.cpp
- #include "MapSite.h"
- #include <iostream>
- using namespace std;
- //´«µÝÒ»¸ö¶ÔÏó¸øCreateMaze×÷²ÎÊýÀ´´´½¨·¿¼ä£¬Ç½±ÚºÍÃÅ£¬¾Í´«µÝ²»Í¬µÄ¹¤³§²ÎÊýÀ´¸Ä±ä·¿¼äǽ±ÚºÍÃŵÄÀà
- //¾ÍÊdzéÏ󹤳§µÄÒ»¸öÀý×Ó
- int main()
- { MazeGame a;
- MazeFactory b;
- EnchantedMazeFactory c;
- a.CreateMaze(c);
- return 0;
- }
- 设计模式笔记--创建型模式之一 抽象工厂
- 设计模式笔记(3)---抽象工厂模式(创建型)
- 设计模式笔记(3)---抽象工厂模式(创建型)
- 设计模式-创建型模式-抽象工厂
- 设计模式-创建型模式-抽象工厂
- 【设计模式】创建型模式-抽象工厂
- 创建型设计模式-抽象工厂模式
- 设计模式学习笔记之一(创建模式---工厂模式)
- 设计模式--创建模式--抽象工厂模式
- 设计模式--创建型--抽象工厂
- 设计模式--创建型-抽象工厂
- 设计模式-创建型03-抽象工厂
- 设计模式-创建型-抽象工厂
- Golang设计模式-创建型-抽象工厂
- 设计模式-创建型-抽象工厂
- java设计模式之创建型模式-抽象工厂模式
- 设计模式->创建型模式->抽象工厂模式
- 设计模式-抽象工厂模式(创建型模式)
- 系统结构(linux)
- 纹理过滤器 Texture Sampler
- poj3250
- 我是学生,我要好好学习!
- IEEE P1471的软件系统体系结构描述
- 设计模式笔记--创建型模式之一 抽象工厂
- poj 3159 heap+dijkstra
- Linq的Set操作
- C/C++中const两种用法的微秒区别
- 闪屏,我们自己动手做,相当简单
- 如何调试Cacti
- ONTOLOGY的名词解释
- 在LINUX下安装MYSQL
- 设计模式笔记--创建型模式之二 Builder