1、工厂方法模式主讲:田旭园程序:奚亮亮ppt:叶良波答问:陈才国1页FACTORYMETHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用FactoryMethod模式,带着MM到服务员那儿,说要一个汉堡,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。感谢王良芳大神在校内的分享,新增20种模式的形象比喻。缺:简单工厂模式、缺省适配模式和不变模式。创建模式:简单工厂、工厂方法、抽象工厂、单例、建造、模型;结构模式:适配器、缺省适配、合成、装饰、代理、享元、门面、桥梁;行为模式:不变、策略、模板方法、观察者、迭代子、责任链、命令备忘录、状态、访问者、解释器、调停者。(最后三种不讲)工厂方法模式是类的创建模式,又叫虚拟构造子(VirtualConstructor)模式或者多态性工厂(PolymorphicFactory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中。工厂方法解决问题:工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。工厂方法缩略图该模式的优点:这种抽象的结果,使这种工厂方法模式可以用来允许系统不修改具体工厂角色的情况下引进新产品,这一特点无疑使得工厂模式具有超过简单工厂模式的优越性。在工厂方法模式中,一般都有一个平行的等级结构,也就是说工厂和产品是对应的的。抽象工厂对应抽象产品,具体工厂对应具体产品。简单的示意图如下:各种角色分类抽象工厂角色:具体工厂角色:抽象产品角色:具体产品角色:72、简单工厂模式主讲人:陈儒组员:韩政高、戴鹏军、陈群1页8简单的介绍•简单工厂模式是创建型模式,用于对象的创建,它不属于23种gof设计模式。它是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。•设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案,是解决某个方向上的变动需求的问题。而工厂设计模式的存在是为了解决哪一方面的问题呢?或者说它的动机是什么呢?9动机•在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。•如何应对这种变化?如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求改变而改变?10优缺点•优点:简单工厂模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。•缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。3、抽象工厂模式—by:缪丹权柳敏乾李青振2页FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说来四个鸡翅就行了。麦当劳和肯德基就是生产鸡翅的Factory工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。抽象工厂模式定义对象创建型模式,又称Kit模式。在设计模式中对AbstractFactory的意图是这样描述的:为了创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。有时候,几个对象需要一种协调的方式实例化。例如,在处理用户界面时,系统可能在一个操作系统上用一组对象,在另一个系统上用另一组对象。AbstractFactory确保系统根据情况获得正确的对象。产品族产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如下图中,箭头所指就是三个功能相关联的产品。它们位于三个不同的等级结构中的相同位置上,组成了一个产品族。为什么需要AF为什么需要AF如果,现在有三个相似的工厂等级结构,那么采用工厂方法模式就势必要使用三个独立的工厂等级结构。由于三个等级结构相似性,会导致三个平行的等级结构。随着产品等级结构的数目增加,工厂方法模式所给出的工厂等级结构的数目也会增加。抽象工厂模式结构图结构与角色•抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用JAVA接口或者抽象JAVA类来实现,而所有的具体工厂类必须实现该接口或者继承抽象类。•具体工厂类(ConreteFactory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑。通常使用具体类来实现这个角色。•抽象产品(AbstractProduct)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用接口或者抽象类来实现这一角色。•具体产品(ConcreteProduct)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。通常使用具体JAVA类来实现。抽象工厂模式时序图在客户新建一个抽象工厂的时候,其实是新建了一个具体的工厂,然后再通过该具体工厂来创建各种具体的产品。抽象工厂模式优缺点优点:程序设计中有三种耦合:零耦合、抽象耦合、具体耦合。抽象工厂设计可以很好的把具体耦合转换到抽象耦合来减少耦合程度。具体产品从客户代码中被分离出来。容易改变产品的系列。将一个系列的产品族统一到一起创建。抽象工厂模式优缺点缺点:由于每个类的产生都要继承抽象类(或接口),并由工厂来创建,这样就增加了代码长度和工作量。在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口。使软件结构更复杂。与其他模式的区别和联系与工厂模式的区别:•工厂方法模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂方法模式的推广。•工厂方法模式用来创建一个产品的等级结构的,而抽象工厂模式是用来创建多个产品的等级结构的。•工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类。总结•工厂的实现通常使用Singleton模式。一个应用中一般每个系列产品只需要使用一个具体工厂的实例。•抽象工厂模式提供了一个创建一系列相关或相互依赖的对象的接口,关键点在于应对”多系列对象创建”的需求变化。•学会抽象工厂模式,可以更好地理解面向对象中的原则:面向接口编程,而不要面向实现编程。组员:汤仲喆王凯李义冬主讲:汤仲喆代码:王凯答辩:李义冬4、TheSingletonPattern(单例模式)1页SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道老公,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的单一实例的需求时才可使用。•什么是单例模式顾名思义,单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。•单例模式的要点(1)某个类只能有一个实例;(2)它必须自行创建这个实例;(3)它必须自行向整个系统提供这个实例。解决方案---单例模式•意图:希望类只有一个实例,但没有控制类实例化的全局变量(对象)。同时希望确保所有客体对象使用该类的相同实例,而无需将引用传给它们。•问题:几个不同的客户对象需要引用同一个对象,而且希望确保这种类型的对象数目不超过一个。•解决方案:保证一个实例•参与者与协作者:客户对象只能通过getInstance()方法创建单例类的实例。•效果:客户对象无需操心是否存在单例类的实例,实例化有单例类自己控制。•实现:–一个引用单例对象的静态私有成员变量–一个公共静态方法,负责实现一次性的实例化并返回对单例对象的引用–设置为保护或私有的构造方法单例模式的关键特征单例模式设计会产生什么问题?•在多线程程序中,Singleton模式可能会出现一个问题。•假设对getInstance()方法的两个调用几乎同时发生,这种情况可能非常糟糕。此时会发生什么?1.第一个线程检查实例是否存在。因为实例不存在,该线程执行创建第一个实例的代码部分。2.然而,假设在实例化完成之前,另一个线程也来检查实例成员变量是否为null。因为第一个线程还什么都没有创建,实例成员变量仍然等于null,所以第二个线程也执行了创建一个对象的代码。3.现在,两个线程都执行了Singleton对象的new操作,因此创建了两个重复的对象。懒汉式VS饿汉式所以,到底使用哪一种方式,要看实际的需求。饿汉式:静态初始化方式,在启动加载单例类时就实例化对象,只实例化一次,以后用到的时候就不需要再去实例化了,加载类的时候速度比较慢,但以后获得对象时的速度比较快,该对象从加载到应用结束一直占用资源。懒汉式:相当于一个延迟加载机制,即你需要这个对象时候才去实例化,加载类的时候速度比较快,但以后获得对象时的速度比较慢,该对象在整个应用的生命周期只有一部分时间占用资源。面临多线程访问的安全性问题,需要做双重锁定处理才可以保证安全。单例模式的应用•一个随机数产生的例子在整个应用程序中只需要一个类的实例来产生随机数,客户端程序从类中获取这个实例,调用这个实例的方法nextInt(),公用的方法访问需要进行同步,这是单例模式需要解决的同步问题。参与者:Singleton定义一个Instance操作,允许客户访问它的唯一实例,Instance是一个类操作,负责创建自己的唯一实例。协作关系:客户只能通过Singleton的Instance操作访问一个Singleton的实例。主讲:范允易小组成员:陈巧燕、刘秀颖、郭娟5、建造者模式(BuilderPattern)--创建型模式1页BUILDER—MM最爱听的就是我爱你这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出我爱你这句话了,国外的MM也可以轻松搞掂,这就是我的我爱你builder。(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。概述Builder模式是一种创建型模式,它主要是应对项目中一些复杂对象的创建工作。所谓“复杂对象”是指:此对象中还含有其它的子对象。意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。--《设计模式》GOFBuilder模式结构建造者(Builder)角色具体建造者(ConcreteBuilder)角色产品(Product)角色指导者(Director)角色时序图优缺点和适用性1.解耦了组装过程和创建具体部件2.职责分离3.精细的控制创建过程4.难于应付“分步骤构建算法”的需求变动适用性:1.复杂的内部结构2.相互依赖的各部分3.创建过程独立4.各部分变化剧烈,组合算法相对稳定相关模式抽象工厂(AbstractFactory)模式共性:创建型模式、创建类对象区别:AbstractFactory模式:解决“系列对象”的需求变化Builder模式:解决“对象部分”的需求变化总结Bu