23中设计模式实例
总结⼀下23中设计模式各⾃的优缺点,及实际情况中如何使⽤。
设计模式分为3⼤类:
创建型模式(5个):
关注点是如何创建⼀个对象。将创建的使⽤和分离。使⽤者只需要使⽤,不需要关注创建的过程
单例模式:⼀个类只能提供⼀个实例,但是可以扩展到优先多例模式;
原型模式:将⼀个类作为原型,通过复制,制造出多个和原型类似的新实例
⼯⼚模式:定义⼀个⽤于创建产品的接⼝,由⼦类决定⽣产什么产品,类创建模式
抽象⼯⼚模式:提供⼀个创建产品族的接⼝,每个⼦类可以创建⼀系列相关的产品
建造者模式:将⼀个对象分解成多个部分,然后分别创建他们
结构型模式(7个):
代理模式:控制客户端对对象的访问
适配器模式:将类的接⼝换成对象需要的
桥接模式:⽤组合⽅式代替继承关系
装饰模式:在不改变现有结构的情况下,动态的增加功能
外观模式:facade,为多个⼦系统提供⼀个统⼀的接⼝
享元模式:共享对象
组合模式:⼀个对象下,有个列表属性,存放⼦对象,构成树结构
⾏为型模式(11个):
模板⽅法模式:
策略模式:适合⽤于多个实现⽅法的统⼀接⼝调⽤的情况。⽐如排序接⼝提供⼀个统⼀的接⼝⽤来被调⽤,但是排序时实际⽐较⼤⼩的策略可以有多个,⽐如按照⾼度⽐较,按照宽度⽐较。所以不同的策略可以通过参数⼊参到排序的⽅法内。排序⽅式只是实现排序的代码即可。
命令模式:
责任链模式:
状态模式:
观察者模式:
中介者模式:
迭代器模式:
访问者模式:
备忘录模式:
解释器模式:
创建型模式(5个):
1、单例模式:
特点:
⼀个类只有⼀个实例对象
该单例对象必须由单例类
单例类对外提供⼀个访问该单例类的⼀个全局访问点
实现:⼀般可以通过new获取多个实例。所以单例的情况,构造函数要设置为私有的
类内定⼀个私有静态实例,再定义⼀个静态公有函数,返回这个私有静态实例
两种⽅式:懒汉式和饿汉式
懒汉式:类加载的时候没有⽣成单例,在调⽤获取单例的⽅法(getInstance)时才创建单例
饿汉式:类⼀加载,就同时创建⼀个单例,在getInstence时单例已经存在
应⽤场景:
1)、只要求⽣成⼀个对象的时候,⽐如⼀个⼈的⾝份证,⼀个班的班长
2)、当对象需要被共享的时候,⽐如数据库的连接池。web中的配置对象,
3)、当某个类频繁被实例话,对象⼜频繁被销毁的时候。多线程的线程池和⽹络连接池
线程池在程序中⼀般只需要⼀个即可,线程的创建都在线程池内操作。线程池是不变的。⽹络池的原理相同扩展:单例模式可以扩展为有限多例模式
将对象创建好后放在⼀个list⾥⾯。这样获取到的实例就是⼀个list,实现有限个实例。
有限多例的应⽤场景:⽐如玩⿇将开始需要执两个骰⼦,此时骰⼦作为⼀个类的话,就需要创建两个实例。
2、原型模式:⽤⼀个已经创建的实例当作原型,复制出多个实例来。
java提供了对象的clone⽅法,实现原型模式很简单
分类:
深克隆:⾃⼰完成每个属性的clone
浅克隆:只需要调⽤clone即可
优点:
1、简化流程
2、动态获取对象
3、某些情况下⽐直接new快⼀些
3、⼯⼚⽅法模式(F actor yMe thod)
抽象⼯⼚接⼝中只⽣产⼀个产品
接⼝:定义⼀个⼯⼚接⼝,⾥⾯包含创建对象⽅法
⼯⼚⼦类:实现⼯⼚接⼝,实现具体的创建对象⽅法
分类:
简单⼯⼚模式:创建的产品不多,只要⼀个⼯⼚类就可以完成(⽆抽象⼯⼚类)
抽象⼯⼚模式:在不修改源代码的情况下,引⼊新的产品(有抽象⼯⼚类)
使⽤于:
⽤户只知道产品⼯⼚名,不知道产品类型
客户不关⼼创建的过程,只关⼼产品的品牌
易于扩展,如果新增⼀个具体产品,则新建⼀个具体⼯⼚,继承抽象⼯⼚。在新建的⼯⼚中写代码,不影响原来的代码实例:
使⽤⼯⼚⽅法模式写⼀个计算器(⾯试)
思路:
抽象⼯⼚接⼝:计算接⼝,⽅式是返回结果
具体⼯⼚类:加法⼯⼚类,乘法⼯⼚类,除法⼯⼚类,减法⼯⼚类。。。
调⽤类:直接使⽤具体的⼯⼚类创建⼀个对象,调⽤返回结果⽅法,即可;
4、抽象⼯⼚模式(ab s tr actF actor y)
抽象⼯⼚接⼝中可以⽣成两个及多个产品
⼯⼚⽅法模式只⽣产⼀个等级的产品,抽象⼯⼚可以⽣产多个等级的产品
使⽤条件:
1、系统中有多个产品族,每个具体的⼯⼚产⽣⼀族产品
2、系统⼀次只可能⽣产某⼀族产品,同族的产品⼀起使⽤
优点:
对同族多产品共同管理
增加⼀个新的产品族时不需要修改源代码,满⾜开闭原则
缺点:
如果产品族中增加⼀个新产品,整个⼯⼚都要修改
5、建造者模式:
使⽤多个简单的对象,⼀步⼀步构建成⼀个复杂的对象
将⼀个复杂的对象拆分成多个简单的对象
使⽤的实例:
套餐的组成(拆分成多个简单的组成),StringBuilder,
优点:
容易扩展,便于控制细节风险
缺点:
如果内部复杂会有多个建造类
产品必须要有共同点
注意:
和抽象⼯⼚模式相⽐,更加注重各个组成部分的顺序
结构型模式:
1、代理模式(p r ox y):
为对象提供⼀种代理,以控制对象的访问,客户端通过代理访问对象,可以控制客户端对对象属性的访问和操作实例:
下载很⼤⽂件,需要时间⽐较长
单位内部数据库,限制客户端的访问
优点:
起中介作⽤,保护⽬标对象
对⽬标对象的功能进⾏扩展
⽬标对象与客户端分离,可以降低系统的耦合度
缺点:
有了中介,请求速度变慢单例模式的几种实现方式
增加系统的复杂度
结构:
真实类
抽象类(接⼝/抽象类)
代理类
2、适配器模式(adapter):将⼀个类的接⼝换成客户端所需要的接⼝,⽐如将交流电转为直流电供笔记本电脑使⽤优点;
将已有的类放到新环境下,使之适应新的需求
可以让两个没有关联的类⼀起运⾏
提⾼了类的复⽤性
提⾼类的透明度
灵活性好
缺点:
过多适配器会是系统变得复杂
java是单继承类,最多只能适配⼀个类
3、桥接模式(bridge):抽象与实现分离,⼆者可以独⽴变化,⽤组合关系代替继承关系,降低了耦合度
优点:
降低耦合度,扩展性强
细节对客户透明
缺点:
设计难度⼤,对系统要有深⼊的理解
结构:
抽象类
扩展抽象类
实现类
具体实现类
适⽤:
⼀个类有两个独⽴变化的维度
4、装饰模式(decorator):在不改变现有结构的情况下,动态的给对象增加⼀些职责
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论