设计模式读书笔记(-) 
  
2004-11-21 
1、什么是 设计模式 ? 
面向对象的软件设计经验总结。 
目标是:使人们更加简单的、方便地复用成功的设计和体系结构。主要在更好得完成系统设计。 
大师说 Christopher Alexander提出:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。” 
上述的定义是对设计模式的广义定义。 
我们将其应用到面向对象软件的领域内,就形成了对设计模式的狭义定义:设计模式就是解决某个特定的面向对象软件问题的特定方法。 
  
2、设计模式 分类 
设计模式自身组成,4个元素: 
        模式名称     取一个名字 
        问题             描述何时使用模式 
        解决方案     描述了模式的各个部分组成、相互关系以及如何协调 
        效果             模式应用达到的效果以及使用模式应当权衡的问题 
  
根据使用模式的目的不同,将模式划分为3类: 
●    创建型(Creational):解决如何创建对象的问题。            
Abstract Factory          抽象工厂模式 
Builder                         生成器模式 
Factory Method           工厂方法模式 
ProtoType                    原型模式 
Singleton               单例模型 
  
  
  
●    结构型(Structural):解决如何正确的组合类或对象的问题。  
Adapter                        适配器模式 
Bridge                          桥接模式 
Compsite               组合对象模式 
Decorator                     装饰模式 
Facede                         外观模式 
FlyWeight                     享元模式 
Proxy                           代理模式 
  
  
  
●    行为型(Behavioral):解决类或对象之间如何交互和如何分配职责的问题。  
Chain of Responsibility                职责链模式 
Command                                         命令模式 
Iterator                                              迭代器模式 
Mediator                                           中介者模式 
Mementor                                         备忘录模式 
Observer                                           观察者模式 
State                                                        状态模式 
Strategy                                             策略模式 
Template Method                              模板方法模式 
Visitor                                               访问者模式 
  
3、抽象工厂模式 
名称:Abstract Factory            抽象工厂模式,又名 Kit 
问题: 
房子是由墙,门,窗户,地板,天花板,柱子组成的。如果我们为客户编写一个建造房子的软件,我们会把墙,门,窗户,地板,天花板,柱子看成不同的类:WallClass, DoorClass, WindowClass, CeilingClass, PillarClass。 
  
现在我们建立一个新类HouseFactory,这个类中有CreateWall(), CreateDoor(), CreateFloor(), CreateCeiling(), CreatePillar()五个方法,每个方法的功能就是创建并返回相应的对象。如果把WallClass, DoorClass, WindowClass, CeilingClass, FloorClass, PillarClass的实例看成产品的话,那么类A就像是一个生产这些产品的工厂。这就是使用工厂这个词的原因。  
  
我们的软件完成了,客户非常满意。不过,我们的客户想把这个软件出口,他发现一个问题,这个软件太本地化了,建造出来的都是中国式的房屋。因此他希望我们的软件能够建造出不同地域风格的房子。 
解决方案: 
        1、我们建立一个抽象的 HouseFactory ,在类中声明: 
               CreateWall(); 
               CreateDoor(); 
CreateFloor(); 
CreateCeiling(); 
CreatePillar(); 
              2、同时,建立抽象的产品 Abstract Product 类集: 
                     Wall, Door, Floor, Ceiling, Pillar 
       3、为 不同的风格建立不同的房子创建类 具体工厂(Concrete Factory)类: 
               ChinaHouseFactory : HouseFactory  
               GreeceHouseFactory : HouseFactory 
               。。。。。。 
        4、为不同的风格简历不同的产品,Concrete Product)类: 
               ChinaWall : Wall  
               ChinaDoor : Door  
               GreeceWall : Wall  
               GreeceDoor : Door 
               。。。。。。 
效果: 
●    重复最后两个步骤,就可以方便的增加新风格;  
●    使用前面两个步骤中声明的抽象类来实现操作。  
抽象工厂模式的重点不是声明的那个抽象工厂类,而是它声明的一系列抽象产品类,我们通过使用这些抽象产品类可以操作我们已经实现或者还未实现的具体产品类,并且保证了它们的一致性。分离了具体的类。 
你可能已经发现这个软件不能建造你的两层别墅,因为它没有楼梯。为此,我们要定义Stair抽象类,还要增加CreateStair抽象方法;最重要的是我们要在已经完成的76种风格中增加相应的Stair类,这可是个大麻烦。 
抽象工厂模式在适应新的产品方面的能力是比较弱的。这是它的一个缺点。也就是说,工厂一旦确立,就已经限定了工厂的产品(你不应当指望一个食品厂能够生产电器) 
  
图:               
    
 
  |