JAVA各种设计模式.docx
- 文档编号:26419046
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:204
- 大小:1.03MB
JAVA各种设计模式.docx
《JAVA各种设计模式.docx》由会员分享,可在线阅读,更多相关《JAVA各种设计模式.docx(204页珍藏版)》请在冰豆网上搜索。
JAVA各种设计模式
一、统一建模语言UML
今天开始重温设计模式,我想把自己学习的过程分享给大家,同时希望大家多多留言来讨论,相互学习相互进步。
设计模式学习过程中需要借助UML来建模,把设计模式图形化,从而让我们更好的理解设计模式内容。
什么是UML,UML是统一建模语言(UnifiedModelingLanguage)的缩写,是当今软件设计的标准图标式设计语言。
UML包括
1、用例图(Usecasediagrams),
2、类图(Classdiagrams),
3、序列图(Sequencediagrams),
4、协作图(Collaborationdiagrams),
5、状态图(Statechartdiagrams),
6、活动图(Activitydiagrams),
7、构件图(Componentdiagrams),
8、部署图(Deploymentdiagrams)
按照这些图的用意大致可以将他们分为两类:
结构图和行为图
结构图:
名称
介绍
类图
类图描述一些类,包的静态结构和它们之间的静态关系
对象图
对象图给出一个系统中的对象快照
构件图
描述可以部署的软件构件(比如jar,ejb等)之间的关系
部署图
描述一个系统软件的拓扑结构
行为图:
名称
介绍
用例图
用例图描述一系列的角色和用例以及他们之间的关系,用来对系统的基本行为进行建模
活动图
描述不同过程之间的动态接触,活动图是用例图所描述的行为的具体化表现
状态图
描述一系列对象内部状态及其状态变化和转移。
时序图
时序图是一种相互作用图,描述不同对象之间信息传递的时序
协作图
是一种相互作用图,描述发出信息,接收信息的一系列对象的组织结构
最常用的UML图有:
类图,用例图,时序图UML的建模工具有很多,如Visio,Rose,EA,PD等。
二、面向对象设计原则
软件设计的核心是提高软件的可复用性和可维护性。
通常一个软件之所以可复用性和可扩展性差的原因在于设计过于僵硬,过于脆弱,复用率低,粘度过高等原因导致的,这时候需要想办法提高可扩展性,灵活性和可插入性,从而提高软件的可复用性和可维护性。
一般可维护性和可复用性不能同时能达到目的,只有遵循一定的设计原则,设计出来的系统才能同时满足可复用性和可维护性。
面向对象设计原则主要有如下几条:
1、“开闭”原则(Open-ClosedPrinciple)简称OCP,讲的是一个软件实体应该对扩展开放对修改关闭。
2、里氏代换原则(LiskovSubstitutionPrinciple)简称LSP,讲的是任何父类出现的地方都可以被子类代替。
3、依赖倒转原则(DependencyINversionPrinciple)简称DIP,讲的是要依赖于抽象不要依赖于实现。
4、接口隔离原则(InterfaceSegregationPrinciple)简称ISP,讲的是为客户端提供尽可能小的单独的接口,而不是提供大的总接口。
5、组合/聚合服用原则(Composition/AggregationPrinciple)简称CARP,讲的是要尽可能使用组合,聚合来达到复用目的而不是利用继承。
6、迪米特法则(LawofDemeter)简称LoD,讲的是一个软件实体应当及尽可能少的其他软件实体发生相互作用。
为什么要在讲设计模式前讲设计原则,是因为设计模式是面向对象设计原则的具体指导,所以有了理论和设计指导我们就可以进入设计模式学习了,设计模式大家常说的有23中,其实现实中要多的多,大概分为三类:
创建模式,结构模式和行为模式。
三、设计模式概述
上一节里提到设计模式分为创建模式,结构模式和行为模式,这节我们来学习它们的定义以及它们包含哪些具体的设计模式。
一、创建模式
创建模式是对类的实例化过程的抽象化。
在一些系统里,可能需要动态的决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。
创建模式描述了怎么构造和封装这些动态的决定。
创建模式分为类的创建模式和对象的创建模式两种。
1、类的创建模式类的创建模式使用继承关系,把类的创建延迟到子类,从而封装了客户端将得到哪些具体类的信息,并且影藏了这些类的实例是如何被创建和放在一起的。
2、对象的创建模式对象的创建模式描述的是把对象的创建过程动态地委派给另外一个对象,从而动态地决定客户端讲得到哪些具体的类的实例,以及这些类的实例是如何被创建和组合在一起的。
创建模式主要包括:
简单工厂模式,工厂方法模式,抽象工厂模式,单例模式,多例模式,建造模式,原始模式。
二、结构模式
结构模式描述如何将类或对象结合在一起形成更大的结构,结构模式也包括类的结构模式和对象的结构模式。
1、类的结构模式类的结构模式使用继承把类、接口等组合在一起,以形成更大的结构。
当一个类从父类继承并实现某接口时,这个新的类就把父类的结构和接口的结构结合起来。
类的结构模式是静态的,一个类的结构模式的经典列子就是适配器模式。
2、对象的结构模式对象的结构模式描述怎么把各种不同的类型的对象组合在一起,以实现新的功能的方法。
对象的结构模式是动态的。
结构模式主要包括:
适配器模式,缺省适配器模式,合成模式,装饰模式,代理模式,享元模式,门面模式,桥模式。
三、行为模式
行为模式是对在不同的对象之间划分责任和算法的抽象化。
行为模式不仅仅是关于类和对象的,而且是关于它们之间相互作用的。
1、类的行为模式类的行为模式使用继承关系在几个类之间分配行为。
2、对象的行为模式对象的行为模式是使用对象聚合类分配行为的。
行为模式主要包括:
不变模式,策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,解释器模式,调停者模式。
四、简单工厂模式
从这节开始学习设计模式,首先学习创建模式,其中工厂模式是创建模式里面最常见也常用的一种,工厂模式又分简单工厂模式(SimpleFactory),工厂方法模式(FactoryMethod)和抽象工厂模式(AbstractorFactory),这里先学习最简单的也就是简单工厂模式。
简单工厂模式(SimpleFactory)也称静态工厂方法模式,是工厂方法模式的特殊实现。
简单工厂模式的一般性结构如下图:
简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类型的实例,下面我们拿实例来介绍简单工厂模式。
如下图,抽象类型车包括子类火车,汽车,拖拉机。
工厂根据传入的参数来创建具体车的类型。
上图中无法形象地表示抽象类所以用接口代替了。
java代码如下:
Java代码
1packagecom.pattern.SimpleFactory;
2/**
3*
4*【描述】:
工厂类
5*【作者】:
yml
6*【时间】:
May20,2012
7*【文件】:
com.pattern.SimpleFactoryFactory.java
8*
9*/
10publicclassFactory{
11/**
12*
13*【描述】:
创建车的实例这个类里面的判断代码在实际应用中多配置成map,如果用spring则可以配置在bean的xml内
14*【作者】:
yml
15*【时间】:
May20,2012
16*@throwsTypeErrorException
17*
18*/
19publicTrafficMachinecreator(Stringtype)throwsTypeErrorException{
20if(type.equals("Automobile")){
21returnnewAutomobile();
22}elseif(type.equals("Tractor")){
23returnnewTractor();
24}elseif(type.equals("Train")){
25returnnewTrain();
26}else{
27thrownewTypeErrorException("notfind"+type);
28}
29}
30}
31packagecom.pattern.SimpleFactory;
32/**
33*
34*【描述】:
汽车类
35*【作者】:
yml
36*【时间】:
May20,2012
37*【文件】:
com.pattern.SimpleFactoryAutomobile.java
38*
39*/
40publicclassAutomobileextendsTrafficMachine{
41@Override
42publicvoidtraffic(){
43//TODOAuto-generatedmethodstub
44}
45}
46packagecom.pattern.SimpleFactory;
47/**
48*
49*【描述】:
拖拉机
50*【作者】:
yml
51*【时间】:
May20,2012
52*【文件】:
com.pattern.SimpleFactoryTractor.java
53*
54*/
55publicclassTractorextendsTrafficMachine{
56@Override
57publicvoidtraffic(){
58//TODOAuto-generatedmethodstub
59}
60/**
61*
62*【描述】:
耕地
63*【作者】:
yml
64*【时间】:
May20,2012
65*
66*/
67publicvoidplough(){
68}
69}
70packagecom.pattern.SimpleFactory;
71/**
72*
73*【描述】:
火车
74*【作者】:
yml
75*【时间】:
May20,2012
76*【文件】:
com.pattern.SimpleFactoryTrain.java
77*
78*/
79publicclassTrainextendsTrafficMachine{
80privateintnodeNum;//节数
81privateinttrainNum;//车次
82@Override
83publicvoidtraffic(){
84//TODOAuto-generatedmethodstub
85}
86publicintgetNodeNum(){
87returnnodeNum;
88}
89publicvoidsetNodeNum(intnodeNum){
90this.nodeNum=nodeNum;
91}
92publicintgetTrainNum(){
93returntrainNum;
94}
95publicvoidsetTrainNum(inttrainNum){
96this.trainNum=trainNum;
97}
98}
99packagecom.pattern.SimpleFactory;
100/**
101*
102*【描述】:
抽象类车
103*【作者】:
yml
104*【时间】:
May20,2012
105*【文件】:
com.pattern.SimpleFactoryMachine.java
106*
107*/
108publicabstractclassTrafficMachine{
109publicfloatpower;
110publicfloatload;
111publicabstractvoidtraffic();
112}
113packagecom.pattern.SimpleFactory;
114/**
115*
116*【描述】:
类型异常类
117*【作者】:
yml
118*【时间】:
May20,2012
119*【文件】:
com.pattern.SimpleFactoryTypeErrorException.java
120*
121*/
122publicclassTypeErrorExceptionextendsException{
123/**
124*
125*/
126privatestaticfinallongserialVersionUID=5620152L;
127publicTypeErrorException(Stringmessage){
128super(message);
129//TODOAuto-generatedconstructorstub
130}
131}
通过以上分析及其代码列举可知,简单工厂类的构造有三种角色,它们分别是工厂角色,抽象产品角色和具体产品角色。
工厂类的创建方法根据传入的参数来判断实例化那个具体的产品实例。
工厂类角色:
这个角色是工厂方法模式的核心,含有及应用紧密相连的商业逻辑。
工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的java类来实现。
抽象产品角色:
担当这个角色的是一个java接口或者java抽象类来实现。
往往是工厂产生具体类的父类。
具体产品角色:
工厂方法模式所创建的任何对象都是这个角色的实例,具体产品往往就是一个具体的java类来承担。
简单工厂的优缺点:
1、优点是因为客户端可以直接消费产品,而不关心具体产品的实现,免除了客户端直接创建产品对象的责任,简单工厂模式就是通过这种方法实现了对责任的分割。
2、缺点是简单工厂在当产品多层次结构复杂时工厂只能依靠自己,这样就形成了一个万能类,如果这个工厂不能工作了,所有的创建都将不能实现,而且当产品类别多结构复杂的情况下,把所有创建放进一个工厂来,是的后期程序的扩展较为困难。
这个困难将在下节(工厂方法)进行讲述。
五、工厂方法模式
工厂方法模式(FactoryMethod)又称虚拟构造子模式,可以说是简单工厂的抽象,也可以理解为简单工厂是退化了的工厂方法模式,其表现在简单工厂丧失了工厂方法的多态性。
我们前一节中提到当产品结构变的复杂的时候,简单工厂就变的难以应付,如果增加一种产品,核心工厂类必须改动,使得整个工厂的可扩展性变得很差,对开闭原则支持不够。
工厂方法模式克服了这些缺点,它定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
一般结构图如下:
工厂方法模式的对简单工厂模式进行了抽象。
有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。
在这个模式中,工厂类和产品类往往可以依次对应。
即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式有如下角色:
抽象工厂(Creator)角色:
是工厂方法模式的核心,及应用程序无关。
任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(ConcreteCreator)角色:
这是实现抽象工厂接口的具体工厂类,包含及应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
在上图中有两个这样的角色:
BulbCreator及TubeCreator。
抽象产品(Product)角色:
工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
在上图中,这个角色是Light。
具体产品(ConcreteProduct)角色:
这个角色实现了抽象产品角色所定义的接口。
某具体产品有专门的具体工厂创建,它们之间往往一一对应。
实例:
延续上节中例子来讲,上节中我们提到造车工厂会造拖拉机,汽车,火车,在一个工厂里明显不能完成,在现实世界中,一定是有自己独立的工厂来做。
因为我们知道拖拉机,汽车,火车有很多共性也有很大差异,共性还是车,肯定都是重工生产,需要钢材,车床加工,都需要动力,都有座椅,车灯等等,那差异就多了,动力不同,火车可能是电动力,汽车是汽油,拖拉机是柴油等等。
我们利用工厂方法来抽象这个造车工厂的模型如下:
通过以上模型可以看出,工厂方法模式是把原来简单工厂里创建对象的过程延迟到了具体实现的子类工厂,这时的工厂从一个类变成了一个接口类型。
六、抽象工厂模式
前面我们介绍了简单工厂,工厂方法模式,这节来看看抽象工厂模式,抽象工厂模式(AbstractFactory)是工厂方法里面最为抽象和最具一般性的形态,是指当有多个抽象角色时,使用的一种工厂模式。
抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
抽象工厂模式和工厂方法模式的最大区别在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品族,从而使得产品具有二维性质。
抽象工厂模式的一般示意类图如下:
下面我们先看抽象工厂的角色都有哪些:
抽象工厂(Creator)角色:
是抽象工厂模式的核心,及应用程序无关。
任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(ConcreteCreator)角色:
这是实现抽象工厂接口的具体工厂类,包含及应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品(Product)角色:
工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品(ConcreteProduct)角色:
这个角色实现了抽象产品角色所定义的接口。
某具体产品有专门的具体工厂创建,它们之间往往一一对应。
如果你很留心,你就发现抽象工厂的角色和工厂方法的角色一样,其实抽象工厂就是在工厂方法的基础上进一步推广。
下面我们来举实例说明,我们还是延续车的例子,我们说我们原有的造车厂扩建,分东北重工厂和华北机械厂,这两个厂都可以造拖拉机,汽车,火车,但是他们在工艺和品牌上都有所不同,我们抽象出以下模型:
通过上图,我们可以看出,我们系统模型中有个两个产品族,一个产品族是东北重工厂产出的所有产品,另一个产品族是华北机械厂生产出的所有产品。
我们也可以看出有多少个实现工厂就有多少个产品族,在工厂角色中有多少工厂方法在同一个产品族类就有多少个具体产品。
七、单例模式
设计模式的创建模式中前面说了工厂模式,这里我们继续来讨论设计模式中另一个创建模式—单例模式。
单例模式(Singleton)是指确保一个类有且仅有一个实例,而且自行实例化并向整个系统提供这个实例。
这个类我们也称它为单例类。
单例模式的使用在现实世界里很多,比如我们常见的打印机打印的作业队列,一个没打印完,那么只有在队列等待;windows回收站,windows视窗里回收站有且只有一个实例。
单例模式的目的就是有且只提供一个实例,所以它有一下几个特点:
1、单例类只能有一个实例;
2、单例类必须自己创建自己惟一的实例;
3、单例类必须给所有其他对象提供这一实例。
单例模式的一般结构如下:
上图可以看出,单例类自己提供一个实例给自己。
由于java语言的特点在单例的实现上有不同的做法,主要体现在单例类如何实例化自己上。
基于上面三个特点我们可以有两种创建单例类实例的方法,第一个是提前创建好,用的时候直接使用;第二种是等到使用的时候再创建实例,业界称第一种为饿汉式,后者成为懒汉式。
饿汉式单例设计模式
Java代码
1packagecom.pattern.singleton;
2/**
3*
4*【描述】:
饿汉式单例模式
5*【作者】:
yml
6*【时间】:
Jul8,2012
7*【文件】:
com.pattern.singleton.HungrySingleton.java
8*
9*/
10publicclassHungrySingleton{
11
12//创建实例
13privatestaticfinalHungrySingletonsingleton=newHungrySingleton();
14
15//私有构造子
16privateHungrySingleton(){}
17
18//静态工厂方法
19publicstaticHungrySingletongetInstance(){
20returnsingleton;
21}
22
23}
懒汉式单例设计模式
Java代码
24packagecom.pattern.singleton;
25/**
26*
27*【描述】:
懒汉式单例模式
28*【作者】:
yml
29*【时间】:
Jul8,2012
30*【文件】:
com.pattern.singleton.LazySingleton.java
31*
32*/
33publicclassLazySingleton{
34
35//创建实例
36privatestaticLazySingletonsingleton=null;
37
38//私有构造子
39privateLazySingleton(){}
40
41//静态工厂方法
42synchronizedpublicLazySingletongetInstance(){
43//如果为空就new一个实例
44if(singleton==null){
45singleton=newLazySingleton();
46}
47returnsingleton;
48}
49
50}
通过上面代码,可以看出他们之间的区别,相对而言单例设计模式比较简单,我们只要记住它的特点就可以简单掌握了。
八、建造模式
建造模式(Builder)是对象的创建模式,建造模式可以将一个产品的内部表象及产品的生产过程分割开来,从而可以是建造过程生成具有不同内部表象的产品对象。
一个产品常有不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,通常我们称作内部表象,不同的产品可以有不同的内部表象,也就是不同的零件。
使用建造模式可以使客户端不需要知道所生成的产品有那些零件,每个产品对应的零件彼此有何不同,是怎么建造出来的,以及怎样组成产品的。
建造模式的简略图如下图所示:
建造模式的角色:
抽象建造者(Builder)角色:
给出一个抽象接口,用来规范产品对象各个组成成分的建造,跟商业逻辑无关,但是一般而言,有多少方法产品就有几部分组成。
具体建造者(ConcreteBuilder)角色:
担任这个角色的是及应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例包括创建产品各个零件和产品本身。
导演者(Director
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 各种 设计 模式