2.对象创建型模式-抽象工厂
抽象工厂:提供一个创建一系列相关或相互依赖对象的接口(抽象工厂类),而无需指定他们具体的类。
抽象工厂模式的实现:1、定义抽象工厂 抽象类MazeFactory以定义一系列创建对象的接口。2、修改客户创建产品的函数,使得该函数可以接收具体工厂类对象,通过抽象工厂方法来创建产品元素对象,避免客户代码对具体类的引用。客户代码仅引用抽象工厂类MazeFactory和抽象产品类Room、Door、Wall。抽象工厂模式在迷宫地图创建中的实现:
/* 抽象工厂类 */ 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(); } virtual Door* MakeDoor(Room* r1, Room* r2) const { return new Door(r1, r2); } }; /* 创建产品的客户代码 */ Maze* MazeGame::CreateMaze(MazeFactory& factory) { Maze* aMaze = factory.MakeMaze(); Room* r1 = factory.MakeRoom(1); Room* r2 = factory.MakeRoom(2); Door* theDoor = factory.MakeDoor(r1, r2); aMaze->AddRoom(r1); aMaze->AddRoom(r2); r1->SetSide(North, factory.MakeWall()); r1->SetSide(East, theDoor); 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, theDoor); } /* 创建迷宫地图的客户代码 */ MazeGame game; MazeFactory factory; game.CreateMaze(factory);
总结:1、将具体工厂作为单件,每个产品系列只需要一个ConcreteFactory的实例。2、创建产品,AbstractFactory仅声明创建产品的接口,真正创建产品由ConcreteFactory子类实现。
抽象工厂模式的效果:
1、分离了具体的类。一个工厂封装创建产品对象的职责和过程,将客户与类的实现分离。
2、使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次--在初始化的时候,具体工厂类通常实现为单件模式。
3、它有利于产品的一致性。
4、难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步