设计模式-02-创建型设计模式
创建型设计模式创建型设计模式Singleton 模式l动机(Motivation)l在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。l如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?l这应该是类设计者的责任,而不是使用者的责任。意图(Intent)l保证一个类仅有一个实例,并提供一个该实例的全局访问点。结构(Structure)参与者参与者lS i n g l e t o nl定义一个I n s t a n c e操作,允许客户访问它的唯一实例。I n s t a n c e是一个类操作(即S m a l l t a l k中的一个类方法和C + +中的一个静态成员函数)。l可能负责创建它自己的唯一实例。协作协作l客户只能通过S i n g l e t o n的I n s t a n c e操作访问一个S i n g l e t o n的实例。Factory Method 模式l工厂模式的缘起l常规的对象创建方法:l/ 创建一个Road 对象lRoad road=new Road();lnew的问题:l实现依赖,不能应对“具体实例化类型”的变化。l解决思路:l封装变化点 哪里变化,封装哪里l潜台词:如果没有变化,当然不需要额外的封装!动机动机(Motivation)l在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。l如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?意图(意图(Intent)l定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。结构(Structure)Factory Method 的几个要点的几个要点lFactory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。lFactory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。lFactory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同Abstract Factory 模式l动机(Motivation)l在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。l如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?意图(Intent)l提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。结构(Structure)Abstract Factory的几个要点的几个要点l如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这时候使用简单的工厂完全可以。l“系列对象”指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中的“道路”与“房屋”的依赖,“道路”与“地道”的依赖。lAbstract Factory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。创建型模式比较创建型模式比较lSingleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。lFactory Method, Abstract Factory, Builder都需要一个额外的工厂类来负责实例化“易变对象”,而Prototype则是通过原型(一个特殊的工厂类)来克隆“易变对象”。l如果遇到“易变类”,起初的设计通常从Factory Method开始,当遇到更多的复杂变化时,再考虑重构为其他三种工厂模式(Abstract Factory, Builder , Prototype )。