设计模式学习笔记(工厂模式)
来源:互联网 发布:东方的漫画软件 编辑:程序博客网 时间:2024/05/16 04:58
一、定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。
C++中的工厂方法(工厂基类中所定义的创建产品的函数)都是虚函数并且常常是纯虚函数。
二、参与者
Product:(工厂基类)定义工厂方法所创建的接口;
ConcreteProduct:(工厂具体类)实现Product接口;
Creator:声明工厂方法,返回一个Product对象;
ConcreteCreator:重新定义工厂方法返回一个ConcreteProduct实例。
三、问题:
Creator声明工厂方法Create,返回一个Product对象
class Creator{public:virtual Product* Create(ProductId);};Product* Creator::Create(ProductId id){if(id == MINE) return new MyProduct;if(id == YOURS) return new YourProduct;return 0;}子类MyCreator可以重新定义工厂方法返回一个ConcreteProduct实例。
Product* MyProduct::Create(ProductId id){if(id == MINE) return new YourProduct;if(id == YOURS) return new MyProduct;if(id == THEIRS) return new TheriProduct;return Creator::Create(id);}
有时,为了创建适当的Product对象,我们不得不创建一个Creator的子类。【可以使用模板子类进行解决】
四、实现例子:
1、工厂基类
Maze、Room、Wall、Door均为产品基类
class MazeGame(){public: Maze* CreatMaze(); virtual Maze* MakeMaze() const { return new Maze;} virtual Room* MakeRoom(int n) const //工厂方法1 { return new Room(n);} virtual Wall* MakeWall() const //工厂方法2 { return nre Wall;} virtual Door* MakeDoor(Room* r1,Room* r2) const { return new Door(r1,r2);}};2、具体工厂类:
class BombedMazeGame: public MazeGame{public:BombedMazeGame();virtual Wall* MakeWall() const //重新定义的工厂方法1{ return new BombedWall;}virtual Room* MakeRoom() const //重新定义的工厂方法2{ return new* RoomWithABomb(n);}}
注意体会与抽象工厂方法的不同,这里每一种产品的实现其实就是工厂模式。上例中具体工厂通过继承工厂基类,重新定义工厂方法,最终实现工厂模式。
比较有困惑的是CreateMaze函数的实现,其实这里主要是为了完整性考虑,CreateMaze函数不属于工厂方法中的参与者。
创建迷宫函数
Maze MazeGame::CreateMaze(){//该函数调用一系列产品基类函数来创建迷宫Maze* aMaze = MakeMaze();Room* r1 = MakeRoom(1);Room* r2 = MakeRoom(2);Door* theDoor = MakeDoor(r1,r2);aMaze->AddRoom(r1);aMaze->AddRoom(r2);r1->SetSide(North,MakeWall());r1->SetSide(East,theDoor);r1->SetSide(South,MakeWall());r1->SetSide(West,MakeWall());r2->SetSide(North,MakeWall());r2->SetSide(East,MakeWall());r2->SetSide(South,MakeWall());r2->SetSide(West,theDoor);}
阅读全文
0 0
- 设计模式学习笔记(工厂模式)
- 设计模式学习笔记之一(创建模式---工厂模式)
- 设计模式学习笔记之工厂模式
- 设计模式学习笔记--工厂模式
- 【设计模式】简单工厂模式学习笔记
- 【设计模式】工厂方法模式学习笔记
- 设计模式学习笔记之工厂模式
- 学习笔记:设计模式之工厂模式
- 设计模式学习笔记--简单工厂模式
- 设计模式学习笔记-工厂方法模式
- 设计模式学习笔记-抽象工厂模式
- java设计模式学习笔记-工厂模式
- 设计模式学习笔记之工厂模式
- 设计模式学习笔记--简单工厂模式
- 设计模式学习笔记--工厂方法模式
- 设计模式学习笔记--抽象工厂模式
- java设计模式-工厂模式学习笔记
- 设计模式学习笔记-简单工厂模式
- 冯诺依曼结构和哈佛结构
- MySQL锁机制
- 单例模式的几种实现方式
- leetcode 75. Sort Colors 很不错的3种元素排序方法 + O(n)
- A Simple Problem with Integers 区间更新和查询
- 设计模式学习笔记(工厂模式)
- EF映射
- 最长上升子序列(LIS)
- 基于Tensorflow实现基本的线性回归(Linear regression)
- hdu 6197array array array(最长不下降子序列nlogn)
- 07-异常
- 【React Native】react-Navigation之StackNavigator
- java jdbc 增删改查
- Leetcode OJ 67 Add Binary [Easy]