设计模式培训资料.docx
《设计模式培训资料.docx》由会员分享,可在线阅读,更多相关《设计模式培训资料.docx(12页珍藏版)》请在冰豆网上搜索。
![设计模式培训资料.docx](https://file1.bdocx.com/fileroot1/2022-12/12/37055a57-6920-44f5-bea1-f3204258ccd0/37055a57-6920-44f5-bea1-f3204258ccd01.gif)
设计模式培训资料
设计模式(DesignPatterns)
目的
了解23种设计模式
掌握常用几种设计模式
设计模式简介
最早提出“设计模式”概念的是建筑设计大师亚力山大Alexander。
在1970年他的《建筑的永恒之道》里描述了投计模式的发现,因为它已经存在了千百年之久,而现代才被通过大量的研究而被发现。
在《建筑的永恒之道》里这样描述:
模式是一条由三个部分组成的通用规则:
它表示了一个特定环境、一类问题和一个解决方案之间的关系。
每一个模式描述了一个不断重复发生的问题,以及该问题解决方案的核心设计。
尽管亚力山大的著作是针对建筑领域的,但他的观点实际上适用于所有的工程设计领域,其中也包括软件设计领域。
“软件设计模式”,这个术语是在1990年代由ErichGamma等人从建筑设计领域引入到计算机科学中来的。
目前主要有23种。
创建型
创建对象时,不再由我们直接实例化对象;而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能、更好的架构优势。
Ø单例模式(Singleton)
Ø构建模式(Builder)
Ø原型模式(Prototype)
Ø简单工厂模式(SimpleFactory)
Ø抽象工厂模式(AbstractFactory)
Ø工厂方法模式(FactoryMethod)
结构型
将类和对象组合起来,以构成更加复杂的结构,帮助开发人员将简单对象组合在一起形成更加复杂的结构,处理对象与对象之间的各种关系
Ø代理模式(Proxy)
Ø适配器模式(Adapter)
Ø装饰者模式(Decorator)
Ø组合模式(Composite)
Ø桥连接模式(Bridge)
Ø蝇量模式(Flyweight)
Ø外观模式(Facade)
行为型
用于帮助系统间各对象的通信,以及如何控制复杂系统中流程。
Ø策略模式(Strategy)
Ø状态模式(State)
Ø责任链模式(ChainofResponsibility)
Ø解释器模式(Interpreter)
Ø命令模式(Command)
Ø观察者模式(Observer)
Ø备忘录模式(Memento)
Ø迭代器模式(Iterator)
Ø模板方法模式(TemplateMethod)
Ø访问者模式(Visitor)
Ø中介者模式(Mediator)
23种设计模式
常见设计模式介绍
1.单例模式(singleton)
有些时候,允许自由创建某个类的实例没有意义,还可能造成系统性能下降。
如果一个类始终只能创建一个实例,则这个类被称为单例类,这种模式就被称为单例模式。
单例模式主要有如下两个优势:
1)减少创建Java实例所带来的系统开销
2)便于系统跟踪单个Java实例的生命周期、实例状态等。
2.简单工厂(StaticFactoryMethod)
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
A实例调用B实例的方法,称为A依赖于B。
如果使用new关键字来创建一个B实例(硬编码耦合),然后调用B实例的方法。
一旦系统需要重构:
需要使用C类来代替B类时,程序不得不改写A类代码。
而用工厂模式则不需要关心B对象的实现、创建过程。
使用简单工厂模式的优势:
让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。
从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。
工厂模式也有一个小小的缺陷:
当产品修改时,工厂类也要做相应的修改。
3.工厂方法(FactoryMethod)和抽象工厂(AbstractFactory)
如果我们不想在工厂类中进行逻辑判断,程序可以为不同产品类提供不同的工厂,不同的工厂类和产不同的产品。
当使用工厂方法设计模式时,对象调用者需要与具体的工厂类耦合,如:
使用简单工厂类,需要在工厂类里做逻辑判断。
而工厂类虽然不用在工厂类做判断。
但是带来了另一种耦合:
客户端代码与不同的工厂类耦合。
为了解决客户端代码与不同工厂类耦合的问题。
在工厂类的基础上再增加一个工厂类,该工厂类不制造具体的被调用对象,而是制造不同工厂对象。
如:
4.外观模式(Facade)
随着系统的不断改进和开发,它们会变得越来越复杂,系统会生成大量的类,这使得程序流程更难被理解。
外观模式可为这些类提供一个简化的接口,从而简化访问这些类的复杂性。
外观模式(Facade)也被称为正面模式、门面模式,这种模式用于将一组复杂的类包装到一个简单的外部接口中。
5.代理模式(Proxy)
代理模式的作用是:
为其他对象提供一种代理以控制对这个对象的访问。
在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式一般涉及到的角色有:
抽象角色:
声明真实对象和代理对象的共同接口;
代理角色:
代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。
同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:
代理角色所代表的真实对象,是我们最终要引用的对象。
看代码
6.桥接模式(Bridge)
由于实际的需要,某个类具有两个以上的维度变化,如果只是使用继承将无法实现这种需要,或者使得设计变得相当臃肿。
而桥接模式的做法是把变化部分抽象出来,使变化部分与主类分离开来,从而将多个的变化彻底分离。
最后提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需要。
看代码
示例源代码: