一文总结三大设计模式(23种设计模式)
Posted java冢狐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文总结三大设计模式(23种设计模式)相关的知识,希望对你有一定的参考价值。
昨天我们介绍了设计模式的七大原则,今天我们介绍一下设计模式中的三大分类具体23种设计模式。
总述
三大设计模式
三大设计模式分别是:创建型、结构型、行为型三种
创建型模式主要用于描述如何创建对象(5种)
结构型模式主要用于描述如何实现类或对象的组合(7种)
行为型模式主要用于描述类或对象怎样交互以及怎样分配职责(11种)
思维导图如下所示:
创建型模式
单例模式
内存中只会创建且仅创建一次对象的设计模式。
饿汉式
public class Singlenton{
// 只实例化一次
private final static Singleton INSTANCE = new Singleton();
// 私有构造方法,防止被实例化
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}
懒汉式(双重检查)
public class Singleton{
// 使用volatile修饰,让变量每次使用的时候从主存主取而不是从各个线程的“工作内存”中
private static volatile Singleton instance;
// 私有构造方法,防止被实例化
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton;
}
}
}
return instance;
}
}
静态内部类模式
public clsaa Singleton{
// 私有构造方法,防止被实例化
private Singleton(){}
// 使用一个内部类来维护单例,只有在改类被加载的时候,才会实例化对象
private static class SingletonInstance{
private static final Singleton INSTANCE = new Singleton();
}
// 获取实例
public static Singleton getInstance(){
return SingletonInstance.INSTANCE;
}
}
饿汉模式升级版,解决了资源浪费的问题,同时也保证了线程安全;只有在内部类被加载的时候,才会去实例化对象;相对于懒汉式,静态内部类的方式避免了排队进同步块做null判断,性能也优于懒汉模式,推荐使用
枚举模式
public enum Singleton{
INSTANCE;
public Singleton getInstance(){
return INSTANCE;
}
}
线程安全,由JVM来保证线程安全和单一实例,在反射和序列化场景中,仍能保证单一实例。
工厂模式
简单工程模式
创建一个统一的工厂类,根据传入的参数不同创建不同的对象,需要在一堆产品中选则其中一个产品。
工厂模式
工厂模式不是用一个统一的工厂类来管理所有的对象,而是每一个对象都有不同的工厂相对应
抽象工厂模式
抽象工厂模式是对工厂模式的进一步优化,工厂类不单单只能创建一个对象,而是创建一组对象
简单工厂模式是外部传值进去,以获取不同对象
抽象工厂模式直接通过方法获取对象,不需要传值
建造者模式
将一个复杂对象的构建与其表示分离,使同样的构建过程可以创建不同的表示。
就是构造的时候只传必须的参数,其他参数通过set方法可选传入。
说明
在类中创建一个静态内部类Builder,然后将类中的参数都复制到Builder类中
在类中创建一个private的构造函数,参数为Builder类型
在Builder中创建设置函数,对类中那些可选参数进行赋值,返回值为Builder类型的实例
在Builder中创建一个build()方法,在其中构件类的实例并返回。
原型模式
使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。
结构型模式
适配器模式
目的在于适配接口
类适配
有一个已存在的将被适配的类
public class Adaptee{
public void adapteeRequest(){
System,out,println("被适配者的方法");
}
}
定义一个目标接口
public interface target{
void request();
}
通过适配器,实现接口继承类,然后调用父类方法即可。
装饰器模式
装饰模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为一个现有的类的一个包装。
动态的添加功能。
代理模式
在代理模式中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式;在代理模式中,我们创建具有现有对象的对象,以便向外提供功能接口
主要分为静态代理和动态代理
外观模式
外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,以隐藏系统的复杂性
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用
外观模式就是将他们的关系放在一个Facade类中,降低了类与类之间的耦合度。
桥接模式
桥接是用于把抽象化与实现化解耦,使得二者可以独立变化。通过提供抽象化和实现化之前的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得是立体的功能独立于接口实现类。这两种类型的类可以被结构化改变而互不影响。
组合模式
是用于把一组相似的对象当做一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式。它创建了对象组合树形结构
创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式
享元模式
主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式
尝试重用现有的同类对象,如果未找到匹配的对象,则创建新的对象。
行为型模式
策略模式和状态模式
相同点
两者通过将行为和状态拆分成一系列小的组件,由条件和状态进行功能更替,这样更符合开闭原则,便于扩展,此外两者均可作为if else或者分支的替代方案;支持的最大行为和状态均有限
不同点
策略模式中,类的功能是根据当前条件主动更改
状态模式中,类的功能是被动由当前状态更改
策略模式中每个行为或算法之间没有关联
状态模式中的状态之间有关联,并且状态本身
解释器模式
提供了评估语言的语法或表达式的方式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在SQL解析、符号处理引擎等。
观察者模式
当对象间存在一对多关系时,则使用观察者模式。比如当一个对象被修改时,则会自动通知它依赖的对象
中介者模式
中介者模式是用来降低多个对象和类之间的通信复杂度。这种模式提供了一个中介类,该类通常处理不同类之间的通信,支持松耦合,使代码易于维护
备忘录模式
保存一个对象的某个状态,以便在适当的时候恢复对象。
命令模式
命令模式是一种数据驱动的设计模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象,该对象执行命令。
责任链模式
为请求创建了一个接受者对象的链。这种模式给予请求的类型,对请求的发送者和接受者进行解耦。
访问者模式
我们使用一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式、元素对象已接收访问者对象,这样访问者对象就可以处理元素对象上的操作。
迭代器模式
是java和.net编程环境中常用到的设计模式。这种模式孕育顺序访问集合对象的元素,不需要知道集合对象底层表示。
模板方法模式
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
最后
如果觉得看完有收获,希望能给我点个赞,这将会是我更新的最大动力,感谢各位的支持
如果看完有不同的意见或者建议,欢迎多多评论一起交流。感谢各位的支持以及厚爱。
——我是冢狐,和你一样热爱编程。
以上是关于一文总结三大设计模式(23种设计模式)的主要内容,如果未能解决你的问题,请参考以下文章