手头的活算是干得差不多了,但是设计上可以做的还有很多,基于此开始看设计模式,也很受启发。另一方面,真正系统的看设计模式,看一遍书再用代码实现没有一定的积累,也只能是粗通皮毛,索性就记录下这些写点自己的理解。创建型模式抽象实例化的过程,封装了具体的类的信息,隐藏了这些类是如何被创建和实例化的。主要的创建型模式有abstract factory,builder,factory method,prototype。通常也会搭配上单件模式用于保证对于每个工厂类只有一个实例化对象。
抽象工厂和工厂方法的区别暂时不怎么清楚。工厂方法的主要目的在于延迟实例化,对应的代码实现方法就是Creater类提供了基本的创建对象接口,用一个独立的操作创建对象,在子类中重定义创建方式。例如一个迷宫程序中定义了基类MAPSITE,及其子类WALL,DOOR,ROOM,MAZE,MAZEGAME。在MAZEGAME中定义了创建基本对象的方法。不同的迷宫复用的时候只需要继承这个类重写这些方法,只需要这些创建的对象派生于最基本的WALL,DOOR等类,从而创建新的对象。工厂方法类似一个生产线,例如一个鞋厂可以生产生产NIKE鞋也可以生产阿迪王,定义基类的时候只需给出创造对象的接口。
class MazeGame {
public:
Maze* CreateMaze ();
virtual Maze* MakeMaze() const
{ return new Maze; }
virtual Room* MakeRoom(int n) const
{ return new Room(n); }
virtual Wall* MakeWall() const
{ return new Wall; }
virtual Door* MakeDoor(Room* r1, Room* r2) const
{ return new Door(r1, r2); }
};
BUILDER模式的特点在于能动态的创建一个对象,而不是直接产生一个实例化了的对象。对应迷宫的例子就是,可以实时给迷宫添加上一个WALL,DOOR,一步一步构造一个复杂对象,而不是直接返回一个产品。
PROTOTYPE模式,用原型实例指定创建对象的种类,通过拷贝对象原型创建新的对象。对应的实现是在DOOR,WALL这些基类中定义CLONE方法,返回一个克隆对象。但当内部有一些不可拷贝(例如申明私有构造函数)或有循环引用的对象时也许就不适用。
一个例子是点餐的时候,一个客人说我不知道隔壁那桌人吃的什么,但我要一份一样的。
class MazeProtypeFactory : public MazeFactory {
public:
MazeProtypeFactory(Maze*, Wall*, Room*, Door*);
virtual Maze* MakeMaze() const;
virtual Room* MakeRoom(int) const;
virtual Door* MakeDoor(Room*, Room*) const;
virtual Wall* MakeWall() const;
private:
Maze* _protypeMaze;
Room* _protypeRoom;
Door* _protypeDoor;
Wall* _protypeWall;
};
SINGLETON单件模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现的方法是讲该类的构造函数声明为protected,将创建实例的过程隐藏在一个类方法中,保证只有一个实例。基本实现代码如下:
class Singleton {
public:
static Singleton* Instance();
protected:
Singleton() {};
private:
static Singleton* _instance;
};
Singleton* Singleton::_instance=0;
Singleton* Singleton::Instance(){
if(_instance==0){
_instance=new Singleton;
}
return _instance;
}