标题: [原创]设计模式研究
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-11-13 22:36  资料  个人空间  主页 短消息  加为好友 
昨天没有写
今天补上

PS
上面那样直接介绍23个模式可能不清楚
还是先把它们分类了再介绍吧

书上都有 所以这里只是简单介绍一下就完了

有两种分类 1是目的分类
可以分成三种
创建型 与对象的创建有关
结构型 处理类或对象的组合
行为型 对类和对象怎样分配职责进行描述


2 是范围分类
表明是作用于类还是作用于对象
类模式处理类与子类的关系 通过继承来实现 编译时就已确定
对象模式处理对象间的关系 这些关系运行时可改变 所以是动态的

创建型类模式把类的创建工作延迟到子类 创建型对象把它延迟到另一个对象中

结构型类模式使用继承方式来组合类(是多重继承吗 有疑问) 结构型对象模式描述了对象的组装方式(通过类成员的方法 这个好理解)

行为型模式使用继承描述算法和控制流 行为型对象模式描述一组对象怎样完成单个对象无法完成的任务


书上有一个表
对照那个表理解的话就比较方便了





不要问我结果 我只研究过程与思路
无双客栈
顶部
qinxj
技术专家
Rank: 14Rank: 14Rank: 14Rank: 14



UID 1117
精华 1
积分 166
帖子 328
活跃指数 0
LU金币 5406 个
LU金条 0 个
阅读权限 200
注册 2003-10-29
 
发表于 2003-11-14 09:43  资料  个人空间  短消息  加为好友  添加 qinxj 为MSN好友 通过MSN和 qinxj 交谈
无双兄能先讲讲prototype吗?





合久必分、分久必和!
顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-11-14 10:01  资料  个人空间  主页 短消息  加为好友 
好的 晚上有空我讲讲





不要问我结果 我只研究过程与思路
无双客栈
顶部
qinxj
技术专家
Rank: 14Rank: 14Rank: 14Rank: 14



UID 1117
精华 1
积分 166
帖子 328
活跃指数 0
LU金币 5406 个
LU金条 0 个
阅读权限 200
注册 2003-10-29
 
发表于 2003-11-14 18:06  资料  个人空间  短消息  加为好友  添加 qinxj 为MSN好友 通过MSN和 qinxj 交谈





合久必分、分久必和!
顶部
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-11-14 18:45  资料  个人空间  主页 短消息  加为好友 
上面两个网站内容不错





不要问我结果 我只研究过程与思路
无双客栈
顶部
99大话王 (gggg)
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
占③为王



LU爱心使者  
UID 260
精华 20
积分 925
帖子 1734
活跃指数 56
LU金币 4461 个
LU金条 4147 个
阅读权限 200
注册 2003-9-30
来自 未来世界
 
发表于 2003-11-16 19:36  资料  个人空间  短消息  加为好友 
学习ing unsure.gif





鸟枪换炮 换马甲鸟
顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-11-19 00:39  资料  个人空间  主页 短消息  加为好友 
创建型类模式
创建型类模式抽象了实例化过程
它们帮助一个系统独立于如何创建组合和表示它们的那些对象

一个类创建型模式使用继承改变被实例化的类
一个对象创建型模式将实例化委托给一个对象( 如抽象工厂中产品的实例化就委托给工厂 原型中是使用一个原型进行Clone来实例化一个对象)

在这些模式中有两个不断出现的主旋律
1 它们都将关于系统使用哪些具体的类的信息进行了封装
2 它们隐藏了这些类的实例是如何被创建和放在一起的 整个系统所知道的是由这些抽象类所定义的接口

因此 创建型模式在什么被创建 由谁创建 它怎样被创建都给了你很大的灵活性

创建型模式有5种方法
1 工厂方法 factory method
2 生成器 builder
3 抽象工厂 abstract factory
4 原型 prototype
5 单件 singleton

http://www.cs.unb.ca/profs/wdu/cs4015w02/ch3a.htm
CODE

下面是其它的说明
Creational design patterns
创建型设计模式
   * Creational design patterns abstract the instantiation process.
创建型设计模式抽象了实例化过程
   * Creational patterns become important as systems evolve to depend more on object composition than class inheritance. Thus creating objects with particular behaviors requires more than simply instantiating a class.
当系统依赖多个对象的组合而不是继承时 创建型模式就会变得很重要,因此使用特殊的方法创建一个对象比实例化一个类还要简单
   * Two recurring themes in creational patterns.
在创建型模式中出现的两上主旋律
         o They all encapsulate knowledge about which concrete classes the system uses.
他们都封装了系统使用的类的具体实现
         o They hide how instances of these classes are created and put together.
他们隐藏了怎样实例化这些类并把他们放在一起的过程
   * The creational patterns give you a lot of flexibility in what gets created, who creates it, how it gets created, and when.

   * They let you configure a system with "product" objects that vary widely in structure and functionality.

   * A common example—building a maze for a computer game—to illustrate their implementations.

enum Direction {North, South, East, West};

class MapSite {
   public:
       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 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 Maze {
   public:
       Maze();
       void AddRoom(Room*);
       Room* RoomNo(int) const;
   private:
       // ...
   };

   Maze* MazeGame::CreateMaze () {
       Maze* aMaze = new Maze;
       Room* r1 = new Room(1);
       Room* r2 = new Room(2);
       Door* theDoor = new Door(r1, r2);
       aMaze->AddRoom(r1);
       aMaze->AddRoom(r2);
       r1->SetSide(North, new Wall);
       r1->SetSide(East, theDoor);
       r1->SetSide(South, new Wall);
       r1->SetSide(West, new Wall);
       r2->SetSide(North, new Wall);
       r2->SetSide(East, new Wall);
       r2->SetSide(South, new Wall);
       r2->SetSide(West, theDoor);
       return aMaze;
   }

   * The real problem with this member function isn't its size but its inflexibility. It hard-codes the maze layout..

   * The creational patterns show how to make this design more flexible, not necessarily smaller.

   * Examples: The enchanted maze game with new kinds of components, e.g. DoorNeedingSpell and EnchantedRoom.

   * The creational patterns provide different ways to remove explicit references to concrete classes from code that needs to instantiate them:

         o If CreateMaze calls virtual functions instead of constructor calls to create the rooms, walls, and doors it requires, then you can change the classes that get instantiated by making a subclass of MazeGame and redefining those virtual functions. This approach is an example of the Factory Method pattern.
         o If CreateMaze is passed an object as a parameter to use to create rooms, walls, and doors, then you can change the classes of rooms, walls, and doors by passing a different parameter. This is an example of the Abstract Factory pattern.
         o If CreateMaze is passed an object that can create a new maze in its entirety using operations for adding rooms, doors, and walls to the maze it builds, then you can use inheritance to change parts of the maze or the way the maze is built. This is an example of the Builder pattern.
         o If CreateMaze is parameterized by various prototypical room, door, and wall objects, which it then copies and adds to the maze, then you can change the maze's composition by replacing these prototypical objects with different ones. This is an example of the Prototype pattern.

         o The singleton pattern ensure there's only one maze per game and that all game objects have ready access to it, and makes it easy to extend or replace the maze without touching existing code.





不要问我结果 我只研究过程与思路
无双客栈
顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
99大话王 (gggg)
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
占③为王



LU爱心使者  
UID 260
精华 20
积分 925
帖子 1734
活跃指数 56
LU金币 4461 个
LU金条 4147 个
阅读权限 200
注册 2003-9-30
来自 未来世界
 
发表于 2003-11-23 22:13  资料  个人空间  短消息  加为好友 
好久没来这里转转了 sad.gif





鸟枪换炮 换马甲鸟
顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
无双
荣誉斑竹
Rank: 14Rank: 14Rank: 14Rank: 14
天才猪



UID 4
精华 84
积分 5863
帖子 11390
活跃指数 0
LU金币 4248 个
LU金条 0 个
阅读权限 200
注册 2003-9-16
来自 杭州
 
发表于 2003-11-27 19:08  资料  个人空间  主页 短消息  加为好友 
好久没写了
今天继续





不要问我结果 我只研究过程与思路
无双客栈
顶部
[广告] 记录自己的思想火花,留住每日的技术积累,尽在拥有属于自己独立域名的博客。
 



当前时区 GMT+8, 现在时间是 2008-10-11 19:10
乐悠LoveUnix论坛-京ICP备05005823号

Thanks to Discuz!  © 2001-2007    Power by LoveUnix.net
Processed in 0.056505 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - 乐悠LoveUnix - Archiver