总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。
参考自 https://blog.csdn.net/HeroIsUseless/article/details/106722590
代理模式
代理模式的主要优点有:
- 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;
- 代理对象可以扩展目标对象的功能;
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度;
其主要缺点是:
- 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;
- 增加了系统的复杂度;
代理模式的主要角色如下:
- 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
- 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
- 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
package proxy;
public class ProxyTest
{
public static void main(String[] args)
{
Proxy proxy=new Proxy();
proxy.Request();
}
}
//抽象主题
interface Subject
{
void Request();
}
//真实主题
class RealSubject implements Subject
{
public void Request()
{
System.out.println("访问真实主题方法...");
}
}
//代理
class Proxy implements Subject
{
private RealSubject realSubject;
public void Request()
{
if (realSubject==null)
{
realSubject=new RealSubject();
}
preRequest();
realSubject.Request();
postRequest();
}
public void preRequest()
{
System.out.println("访问真实主题之前的预处理。");
}
public void postRequest()
{
System.out.println("访问真实主题之后的后续处理。");
}
}
-
引用自 https://blog.csdn.net/fedorafrog/article/details/104898302?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162581271116780274193523%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162581271116780274193523&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-2-104898302.first_rank_v2_pc_rank_v29&utm_term=%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187
-
参考 https://blog.csdn.net/xiaofeng10330111/article/details/105633821?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162581271116780274193523%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162581271116780274193523&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-105633821.first_rank_v2_pc_rank_v29&utm_term=%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187
单例模式
- 单例模式的功能是用来保证这个类的运行期间只会被创建一个类实例,并提供一个全局唯一访问这个类实例的访问点。
- 可分为懒汉式(线程不安全)和饿汉式(线程安全)
饿汉式和懒汉式区别:
-
从名字上来说,饿汉和懒汉,
-
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
-
而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
-
参考 https://blog.csdn.net/jason0539/article/details/23297037?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162579334316780264066667%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162579334316780264066667&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-23297037.first_rank_v2_pc_rank_v29&utm_term=%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187
委派模式
-
相当于 策略模式 + 代理模式
-
参考 https://blog.csdn.net/liman65727/article/details/79720352?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162582365716780262531785%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162582365716780262531785&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-79720352.first_rank_v2_pc_rank_v29&utm_term=%E5%A7%94%E6%B4%BE%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187
策略模式
- 参考 https://blog.csdn.net/youanyyou/article/details/116931663?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162581700216780274186764%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162581700216780274186764&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-116931663.first_rank_v2_pc_rank_v29&utm_term=%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187
原型模式
- 参考 https://blog.csdn.net/zhengzhb/article/details/7393528?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162582420916780261922603%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162582420916780261922603&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-7393528.first_rank_v2_pc_rank_v29&utm_term=%E5%8E%9F%E5%9E%8B%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187
模板模式
- 参考 https://blog.csdn.net/qq_20967339/article/details/80504108?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162582466716780261931660%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162582466716780261931660&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-80504108.first_rank_v2_pc_rank_v29&utm_term=%E6%A8%A1%E6%9D%BF%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187